zoukankan      html  css  js  c++  java
  • Tronado自定义Session

    这里就不一一诉说Session和Cookie直接的关系了,下面以一张图来概括:

    下面是一个简单的Tornaod自定义Session的例子,看完后你可能会明白为什么我们在Django里可以直接使用request.session来获取或者设置键值对的原因,在这个例子中包含了许多调用类里面的方法,例如__contains__ , __getitem__ , __setitem__ , __delitem__等:

    版本1:

    import tornado.ioloop
    import tornado.web
    import time,hashlib
    from controllers.account import LoginHandler
    from controllers.home import HomeHandler
    
    container = {}
    # container = { '随机字符串或者cookie':{'uuuu':'root','k1':'v1'}, }
    
    class Session(object):
        def __init__(self,handler):
            self.handler = handler
            self.random_str = None              # 随机字符串,也有可能是cookie
            self.client_random_str = self.handler.get_cookie('session_id')
            print('哪里来的str',self.client_random_str)
            if not self.client_random_str:
                """新用户,没有cookie的"""
                # 1. 生成随机字符串当作session中的key,保存在大字典container中,用户每次访问都到里面找是否有该值
                self.random_str = self.create_random_str()
                container[self.random_str] = {}                 # 保存在大字典
            else:
                if self.client_random_str in container:
                    """老用户,在container大字典里面了"""
                    self.random_str = self.client_random_str
                    print('老用户',container)
                else:
                    """非法用户,伪造的cookie"""
                    self.random_str = self.create_random_str()
                    container[self.random_str] = {}
    
            # 2. 生成cookie,必须调用LoginHandler才能使用set_cookie()
            timeOut = time.time()
            self.handler.set_cookie('session_id',self.random_str,expires=timeOut+1800)
    
            # 3. 写入缓存或数据库  ==> 后面用户自己调用session['uuuu'] = 'root'
    
        def create_random_str(self):
            now = str(time.time())
            m = hashlib.md5()
            m.update(bytes(now,encoding='utf-8'))
            return m.hexdigest()
    
        def __setitem__(self, key, value):
            # print(key,value)                 # key 就是用户自己设置session['uuuu']='root'中的uuuu,value就是root
            container[self.random_str][key] = value
            # print('setitem',container)
    
        def __getitem__(self, item):
            # print(item)                       # uuuu
            # print('getitem',container)
            return container[self.random_str].get(item)
    
        def __delitem__(self, key):
            pass
        def open(self):
            pass
        def cloes(self):
            pass
    
    class Foo(object):
        def initialize(self):
            # print(self)         # <__main__.LoginHandler object at 0x00000000038702E8>
            self.session = Session(self)
            super(Foo, self).initialize()       # 执行RequestHandler中的initialize
    
    class HomeHandler(Foo,tornado.web.RequestHandler):
        def get(self):
            print('session',self.session)
            user = self.session['uuuu']         # 调用Session类中的__getitem__方法, 获取value
            print('user',user)
            if not user:
                self.write('不是合法登录')
            else:
                self.write(user)
    
    class LoginHandler(Foo,tornado.web.RequestHandler):
        def get(self):
    
            # self.session['uuuu']                  # 调用Session类中的__getitem__方法, 获取value
            # del self.session['uuuu']              # 调用Session类中的__delitem__方法, 删除
            self.session['uuuu'] = "root"           # 调用Session类中的__setitem__方法,在session里面设置了uuuu
            self.write("Hello, world")
            print(container)
            self.redirect('/home')
    
    
    
    application = tornado.web.Application([
        # (r"/index", MainHandler),
        (r"/login", LoginHandler),
        (r"/home", HomeHandler),
    ])
    
    if __name__ == "__main__":
        application.listen(8888)
        tornado.ioloop.IOLoop.instance().start()
    Version 1

    版本2,可根据需要将session写入缓存或者数据库,下面以写入Cache为例:

    import tornado.ioloop
    import tornado.web
    import time,hashlib
    from controllers.account import LoginHandler
    from controllers.home import HomeHandler
    
    container = {}
    # container = { '随机字符串或者cookie':{'uuuu':'root','k1':'v1'}, }
    
    class Cache(object):
        """将session保存在内存"""
        def __init__(self):
            # self.container = {}
            pass
        def __contains__(self, item):
            print('__contains__:',item)
            return True
        def initial(self,random_str):
            container[random_str] = {}
        def get(self,random_str,key):
            return container[random_str].get(key)
    
        def set(self,random_str,key,value):
            container[random_str]={}
            container[random_str][key] = value
        def delete(self,random_str,key):
            del container[random_str][key]
        def open(self):
            pass
        def close(self):
            pass
        def clear(self,random_str):
            del container[random_str]
    
    class Memcache(object):
        def __init__(self):
            pass
        def get(self,key):
            pass
        def set(self,key,value):
            pass
        def delete(self,key):
            pass
        def open(self):
            pass
        def close(self):
            pass
    
    P = Cache           # 3. 可以是Memcache,根据用户自己选择要写入缓存还是数据库...
    
    class Session(object):
        def __init__(self,handler):
            self.handler = handler
            self.random_str = None              # 随机字符串,也有可能是cookie
            self.ppp = P()
            # 去用户请求信息中获取session_id,如果没有,新用户
            self.client_random_str = self.handler.get_cookie('session_id')
            if not self.client_random_str:
                "新用户"
                self.random_str = self.create_random_str()
                container[self.random_str] = {}
            else:
                if self.client_random_str in self.ppp:
                    "老用户"
                    self.random_str = self.client_random_str
                else:
                    "非法用户"
                    self.random_str = self.create_random_str()
                    self.ppp.initial(self.random_str)
    
            # 2. 生成cookie,必须调用LoginHandler才能使用set_cookie()
            timeOut = time.time()
            self.handler.set_cookie('session_id',self.random_str,expires=timeOut+1800)
    
            # 3. 写入缓存或数据库 Cahce、Memcache    ==> 后面用户自己调用session['uuuu'] = 'root'
    
        def create_random_str(self):
            now = str(time.time())
            m = hashlib.md5()
            m.update(bytes(now,encoding='utf-8'))
            return m.hexdigest()
    
        def __setitem__(self, key, value):
            # print(key,value)                 # key 就是用户自己设置session['uuuu']='root'中的uuuu,value就是root
            self.ppp.set(self.random_str, key, value)
            print('1',container)
    
        def __getitem__(self, item):
            # print(item)                       # uuuu
            # print('getitem',container)
            print('2',container)
            return self.ppp.get(self.random_str,item)
    
        def __delitem__(self, key):
            self.ppp.delete(self.random_str,key)
        def open(self):
            pass
        def cloes(self):
            pass
    
    class Foo(object):
        def initialize(self):
            # print(self)         # <__main__.LoginHandler object at 0x00000000038702E8>
            self.session = Session(self)        # 传入Session的self就是调用者,谁调用Session谁就是self
            super(Foo, self).initialize()       # 执行RequestHandler中的initialize
    
    class HomeHandler(Foo,tornado.web.RequestHandler):
        def get(self):
            user = self.session['uuuu']         # 调用Session类中的__getitem__方法, 获取value
            print('user',user)
            if not user:
                self.write('不是合法登录')
            else:
                self.write(user)
            print('哈哈哈测试成功,删除啦')
            del self.session['uuuu']
            print(container)
    
    class LoginHandler(Foo,tornado.web.RequestHandler):
        def get(self):
            # self.session['uuuu']                  # 调用Session类中的__getitem__方法, 获取value
            # del self.session['uuuu']              # 调用Session类中的__delitem__方法, 删除
            self.session['uuuu'] = "root"           # 调用Session类中的__setitem__方法,在session里面设置了uuuu
            self.write("Hello, world")
            # print(container)
            self.redirect('/home')
    
    
    
    application = tornado.web.Application([
        # (r"/index", MainHandler),
        (r"/login", LoginHandler),
        (r"/home", HomeHandler),
    ])
    
    if __name__ == "__main__":
        application.listen(9999)
        tornado.ioloop.IOLoop.instance().start()
    Version 2
  • 相关阅读:
    【转】Exchange Server 的防火墙开放端口
    【转】AD常用端口
    centos6安装python3
    CMD下的netstat命令
    CMD定时倒数
    【转】netstat 的10个基本用法
    不联网如何PING通WIN主机和VMWARE(懵懂版,不含原理)
    【转载】Putty出现 Network error:Software caused connection abort
    MFC Unicode 字符集下格式转换
    MFC嵌套OpenCV窗口并显示图片
  • 原文地址:https://www.cnblogs.com/ray-h/p/10593626.html
Copyright © 2011-2022 走看看