• 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 。

    其他文件不变。

  • 相关阅读:
    PHP的反射机制
    mysqlbinlog
    PHP调用java的class
    ecshop session机制
    memory_limit session.cache_expire ecshop初始化注释说明
    ecshop运行超过30秒超时的限制解决办法
    如果你想拥有事业,而非仅仅是工作
    扎克伯格谈”人际交往”趋势
    Magento架构分析,Magento MVC 设计分析
    推荐的PHP编码规范
  • 原文地址:https://www.cnblogs.com/wumingxiaoyao/p/6737993.html
Copyright © 2020-2023  润新知