• tornado 自定义session (二)


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

    其他文件不变。

  • 相关阅读:
    线程同步总结
    Map,HashMap,LinkedHashMap,TreeMap比较和理解
    实现自定义注解
    SSM框架中写sql在dao文件中以注解的方式
    SSM框架中写sql在xml文件中
    自由创蚁-青少年积木式编程平台正式发布了!
    回调函数
    全面理解Javascript闭包和闭包的几种写法及用途
    hover伪类
    添加背景音乐
  • 原文地址:https://www.cnblogs.com/wumingxiaoyao/p/6737993.html
Copyright © 2020-2023  润新知