有了上一步的基础,我们将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 。

 

其他文件不变。