首页 > 其他 > 详细

Tronado自定义Session

时间:2019-03-25 14:55:13      阅读:142      评论:0      收藏:0      [点我收藏+]

这里就不一一诉说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

 

Tronado自定义Session

原文:https://www.cnblogs.com/ray-h/p/10593626.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!