一、为什么需要sesson?
当客户端(或浏览器)需要保存较多信息时,如果通过cookie设置在客户端:
一方面:服务器调用信息时需要浪费很多流量;另一方面:密码、账户等信息,保存在客户端安全;
二、session是什么?
sesson也是用来保存客户端数据的,不同的是:cookie在浏览器端、sesson在服务器端,
sesson是基于cookie设置的,基本原理如下:
1、服务器为登录的客户端生成一个独立的随机码token,
2、服务器开辟一个与随机码一一对应的容器空间,存储客户端数据,
3、随机码通过cookie写入客户端
4、客户端每次请求访问时,通过cookie携带随机码,
5、服务器根据客户端携带的随机码调取相关容器内的保存数据,
三、sesson中数据的保存位置
1、服务器内存:服务器不重启,数据始终保持
2、数据库:不受服务器重启影响
3、缓存:即其他机器的内存
注意:tornado中不含sesson,需要自定义,最基本sesson如下:
#!/usr/bin/env python # -*- coding:utf-8 -*- import tornado.ioloop import tornado.web container = {} # container存放位置:1、内存(服务器不重启,永久生效);2、数据库(不受服务器重启影响);3、缓存(即另一台机器的内存) class IndexHandler(tornado.web.RequestHandler): def get(self): # 首先判断是否已注册,注册过进行如下操作: if self.get_argument('u',None) in ['lucy','luna','dongxue']: # 注册过才能登录 # 一、进行服务器端sesson配置 # 1、生成一组随机码(这里使用的是当前时间) import hashlib import time obj = hashlib.md5() obj.update(bytes(str(time.time()),encoding='utf-8')) # 当前时间time.time()是float类型 random_str = obj.hexdigest() # 2、生成随机码对应的容器,保存客户信息 container[random_str] = {} container[random_str]['name'] = self.get_argument('u',None) + "parent" container[random_str]['k1'] = 123 container[random_str]["is_login"] = True # 二、进行客户端的sesson配置 # 将随机码通过cookie写入客户端 print(random_str) self.set_secure_cookie('kkk',random_str) else: self.write("请注册!") class ManagerHandler(tornado.web.RequestHandler): # 模拟登陆后再次访问 def get(self): random_str = str(self.get_secure_cookie('kkk'),encoding='utf-8') current_user_info = container.get(random_str,None) if not current_user_info: self.redirect('/index') else: if not current_user_info.get("is_login",""): # current_user_info["is_login"]若取值失败会报错,get更严谨, self.redirect('/index') else: temp = "%s--%s"%(current_user_info.get("k1",""),current_user_info.get("name","")) #str拼接时None会出错 self.write(temp) # 路径解析 settings = { "template_path":"views", "static_path":"statics", "cookie_secret":"nifjewoifnewkfcn", } # 二级路由,先匹配域名, application = tornado.web.Application([ (r"/index",IndexHandler), (r"/manager",ManagerHandler), ],**settings) # 开启服务器,监听 if __name__ == "__main__": application.listen(8888) tornado.ioloop.IOLoop.instance().start()
浙公网安备 33010602011771号