python---定义一个session类
首先:注意cookie中的get_cookie是返回字符串,而get_secure_cookie返回的是字节类型
#self.get_secure_cookie()
#The decoded cookie value is returned as a byte string (unlike
#`get_cookie`).
md5加密获取的十六进制也是返回的字符串类型
import hashlib
import time
obj = hashlib.md5()
obj.update(bytes(str(time.time()), encoding="utf8"))#传入byte类型
random_str = obj.hexdigest()#返回字符串
""" Return the digest value as a string of hexadecimal digits. """
以下是自定义的session类,以及使用:
import tornado.web
#放在内存 redis 文件 数据库
container={}
#定义一个session类
class Session:
def __init__(self,handler):
self.handler=handler
pass
def __genarate_random_str(self):
import hashlib
import time
obj = hashlib.md5()
obj.update(bytes(str(time.time()), encoding="utf8"))#传入byte类型
random_str = obj.hexdigest()#返回字符串
return random_str
def set_value(self,key,value):
#在container中加入随机字符串
#加入自定义数据
#在客户端中写入随机字符串
random_str=''
if self.handler.get_cookie('py_session'):
random_str=self.handler.get_cookie('py_session')
if not container.get(random_str,None):
random_str = self.__genarate_random_str()
else:
random_str=self.__genarate_random_str()
if not container.get(random_str,None):
container[random_str]={}
container[random_str][key]=value
#加入客户端
self.handler.set_cookie('py_session',random_str)
def get_value(self,key):
#先去获取客户端的随机字符串
#从container中获取自定义数据
random_str=self.handler.get_cookie('py_session',None)
dict_info=container.get(random_str,None)
if not dict_info:
return None
return dict_info[key]
class IndexHandler(tornado.web.RequestHandler):
def get(self):
if self.get_argument('u',None) in ['asd','zxc']:
s = Session(self)
s.set_value('is_login',True)
#self.get_secure_cookie()
#The decoded cookie value is returned as a byte string (unlike
#`get_cookie`).
else:
self.write("请登录")
class ManagerHandler(tornado.web.RequestHandler):
def get(self, *args, **kwargs):
s=Session(self)
val = s.get_value('is_login')
if val:
self.write("登录成功")
else:
self.redirect("/index")
settings ={
'template_path':'views',
'static_path':'statics',
'cookie_secret':'dafawafawfaw',
}
application = tornado.web.Application([
(r"/index",IndexHandler),
(r"/manager",ManagerHandler),
],**settings)
但是上述类存在一个bug,会多产生一个数据,占用空间
#在这里有个bug,当程序两次设置值时,逻辑相同,但是由于只发送了一次请求,获取了第一次的py_session
#在相同逻辑代码处理下random_str=self.handler.get_cookie('py_session')
#每次都是不正确的,都需要重新创建一个标识符
#但是后面的刷新过程中由于修改了客户区的py_session,所以可以正常进行操作,但是第一次产生的py_session的依旧存在服务端
s.set_value('is_login',True)
s.set_value('name',self.get_argument('u'))