基于sesson的基本原理和步骤,在tornado中进行自定义,初级版本如下:
#!/usr/bin/env python # -*- coding:utf-8 -*- import tornado.ioloop import tornado.web container = {} class Sesson: def __init__(self,handler): self.handler = handler self.random_str = None def __generate_random_str(self): # 生成一组随机码(这里使用的是当前时间) import hashlib import time obj = hashlib.md5() obj.update(bytes(str(time.time()),encoding='utf-8')) random_str = obj.hexdigest() return random_str def set__value(self,key, value): # 生成随机码对应的容器,保存客户信息,将随机码写入客户端 if not self.random_str: # 一次请求,多次操作时,避免重复刷新随机码 random_str = str(self.handler.get_secure_cookie('kkk'),encoding='utf-8') # 获取客户端随机码 if not random_str: # 如果客户端没有随机码,生成 random_str = self.__generate_random_str() container[random_str] = {} else: if random_str in container.keys(): # 如果客户端有随机码,且与服务器端一致,保留 pass else: # 如果客户端有随机码,但是与服务器端不一致,重新生成 random_str = self.__generate_random_str() container[random_str] = {} self.random_str = random_str container[self.random_str][key] = value self.handler.set_secure_cookie('kkk',self.random_str) def get_value(self,key): # 获取客户端的随机码,提取数据 random_str = str(self.handler.get_secure_cookie('kkk'),encoding='utf-8') # 获取客户端随机码 if not random_str: # 如果客户端没有随机码,取不到值,返回空 return None user_info_dict = container.get(random_str,None) # 如果客户端有随机码,但是与服务器端不匹配,也返回空 if not user_info_dict: return None val = user_info_dict.get(key,None) # 如果客户端有随机码,且与服务器端一致,返回相应的值 return val class IndexHandler(tornado.web.RequestHandler): def get(self): if self.get_argument('u',None) in ['lucy','luna','dongxue']: s = Sesson(self) s.set__value('is_login',True) s.set__value('name',self.get_argument('u',None)) print(container) else: self.write("请注册!") class ManagerHandler(tornado.web.RequestHandler): def get(self): s = Sesson(self) val = s.get_value('is_login') if val: self.write(s.get_value('name')) else: self.write("失败!") # 路径解析 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()
在上诉版本中,每一个handler中,都需要实例化一次Sesson,比较麻烦,
可以应用tornado类__init__()中的initialize(),进一步优化如下:
#!/usr/bin/env python # -*- coding:utf-8 -*- import tornado.ioloop import tornado.web container = {} class Sesson: def __init__(self,handler): self.handler = handler self.random_str = None def __generate_random_str(self): # 生成一组随机码(这里使用的是当前时间) import hashlib import time obj = hashlib.md5() obj.update(bytes(str(time.time()),encoding='utf-8')) random_str = obj.hexdigest() return random_str def set__value(self,key, value): # 生成随机码对应的容器,保存客户信息,将随机码写入客户端 if not self.random_str: # 一次请求,多次操作时,避免重复刷新随机码 random_str = str(self.handler.get_secure_cookie('kkk'),encoding='utf-8') # 获取客户端随机码 if not random_str: # 如果客户端没有随机码,生成 random_str = self.__generate_random_str() container[random_str] = {} else: if random_str in container.keys(): # 如果客户端有随机码,且与服务器端一致,保留 pass else: # 如果客户端有随机码,但是与服务器端不一致,重新生成 random_str = self.__generate_random_str() container[random_str] = {} self.random_str = random_str container[self.random_str][key] = value self.handler.set_secure_cookie('kkk',self.random_str) def get_value(self,key): # 获取客户端的随机码,提取数据 random_str = str(self.handler.get_secure_cookie('kkk'),encoding='utf-8') # 获取客户端随机码 if not random_str: # 如果客户端没有随机码,取不到值,返回空 return None user_info_dict = container.get(random_str,None) # 如果客户端有随机码,但是与服务器端不匹配,也返回空 if not user_info_dict: return None val = user_info_dict.get(key,None) # 如果客户端有随机码,且与服务器端一致,返回相应的值 return val class BaseHandler(tornado.web.RequestHandler): def initialize(self): self.sesson = Sesson(self) class IndexHandler(BaseHandler): def get(self): if self.get_argument('u',None) in ['lucy','luna','dongxue']: self.sesson.set__value('is_login',True) self.sesson.set__value('name',self.get_argument('u',None)) print(container) else: self.write("请注册!") class ManagerHandler(BaseHandler): def get(self): val = self.sesson.get_value('is_login') if val: self.write(self.sesson.get_value('name')) else: self.write("失败!") # 路径解析 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()
其他语言中的sesson,通用格式如:self.sesson【"is_login"】= True,
应用python中的__setitem__、__getitem__、__delitem__,进一步优化如下:
#!/usr/bin/env python # -*- coding:utf-8 -*- import tornado.ioloop import tornado.web container = {} class Sesson: def __init__(self,handler): self.handler = handler self.random_str = None def __generate_random_str(self): # 生成一组随机码(这里使用的是当前时间) import hashlib import time obj = hashlib.md5() obj.update(bytes(str(time.time()),encoding='utf-8')) random_str = obj.hexdigest() return random_str def __setitem__(self, key, value): # 生成随机码对应的容器,保存客户信息,将随机码写入客户端 if not self.random_str: # 一次请求,多次操作时,避免重复刷新随机码 random_str = str(self.handler.get_secure_cookie('kkk'),encoding='utf-8') # 获取客户端随机码 if not random_str: # 如果客户端没有随机码,生成 random_str = self.__generate_random_str() container[random_str] = {} else: if random_str in container.keys(): # 如果客户端有随机码,且与服务器端一致,保留 pass else: # 如果客户端有随机码,但是与服务器端不一致,重新生成 random_str = self.__generate_random_str() container[random_str] = {} self.random_str = random_str container[self.random_str][key] = value self.handler.set_secure_cookie('kkk',self.random_str) def __getitem__(self, key): # 获取客户端的随机码,提取数据 random_str = str(self.handler.get_secure_cookie('kkk'),encoding='utf-8') # 获取客户端随机码 if not random_str: # 如果客户端没有随机码,取不到值,返回空 return None user_info_dict = container.get(random_str,None) # 如果客户端有随机码,但是与服务器端不匹配,也返回空 if not user_info_dict: return None val = user_info_dict.get(key,None) # 如果客户端有随机码,且与服务器端一致,返回相应的值 return val class BaseHandler(tornado.web.RequestHandler): def initialize(self): self.sesson = Sesson(self) class IndexHandler(BaseHandler): def get(self): if self.get_argument('u',None) in ['lucy','luna','dongxue']: self.sesson['is_login'] = True self.sesson['name'] = self.get_argument('u',None) print(container) else: self.write("请注册!") class ManagerHandler(BaseHandler): def get(self): val = self.sesson['is_login'] if val: self.write(self.sesson['name']) else: self.write("失败!") # 路径解析 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号