tornado 自定义session (二)

时间:2023-03-10 01:50:19
tornado 自定义session (二)

有了上一步的基础,我们将session改造成一个模块,这样我们就可以通过配置,来使用不同方式(redis,数据库等)的session。

tornado 自定义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 。

其他文件不变。