有了上一步的基础,我们将session改造成一个模块,这样我们就可以通过配置,来使用不同方式(redis,数据库等)的session。
添加一个新目录:TornadoSession
conf.py是配置文件
Tsession.py 是session模块文件
conf.py:
session_type = 'mem'
Tsession.py:
#!/usr/bin/env python # Version = 3.5.2 # __auth__ = '无名小妖' import hashlib import time from TornadoSession import conf def md5(): m = hashlib.md5() m.update(bytes(str(time.time()), encoding='utf8')) return m.hexdigest() class SessionHandler: def initialize(self): self.session_info = SessionFactory.get_session_obj(self) class SessionFactory: @staticmethod def get_session_obj(handler): if conf.session_type == 'mem': return MemSession(handler) elif conf.session_type == 'redis': return RedisSession(handler) class MemSession: container = {} def __init__(self, handler): random_str = handler.get_cookie('__session_id__') if random_str: if random_str in MemSession.container: self.r_str = random_str else: random_str = md5() MemSession.container[random_str] = {} self.r_str = random_str else: random_str = md5() MemSession.container[random_str] = {} self.r_str = random_str handler.set_cookie('__session_id__', random_str, expires=time.time()+200) def __setitem__(self, key, value): ret = MemSession.container[self.r_str][key] = value return ret def __getitem__(self, item): ret = MemSession.container[self.r_str].get(item, None) return ret def __delitem__(self, key): del MemSession.container[self.r_str][key] class RedisSession: pass
注:通过 SessionFactory类 获取配置文件中的信息,来确定使用哪种session。
home.py
import tornado.web from TornadoSession.Tsession import SessionHandler class MainHandler(SessionHandler, tornado.web.RequestHandler): def get(self): # self.write("Hello, world") self.render('index.html') def post(self, *args, **kwargs): user = self.get_argument('user') pwd = self.get_argument('pwd') if user == 'xiao' and pwd == '123': self.session_info['is_login'] = True self.session_info['user'] = user self.redirect('/main') else: self.redirect('/index') class IndexHandler(SessionHandler, tornado.web.RequestHandler): def get(self): current_user = self.session_info['user'] if current_user: self.write(current_user) else: self.write('未登录')
注:需要先继承 SessionHandler 。
其他文件不变。