Tornado之自定义Session组件

一,准备工作:

1.HOOK
请求到达,url对应类,再由请求方式找到对应函数,
那么要执行对应函数,必然要先经过实例化,父类中寻找有,_init_中有一个self.initialize
没有内容,说明这里提供的一个钩子,扩展功能用的

eg:

class MainHandler(tornado.web.RequestHandler):
    def initialize(self):
        self.a=123                        #提供的HOOK,自定义操作
    def get(self):

        print(self.a)
        #self.write("Hello, world")
        #self.render("main.html")
        self.redirect('http://www.baidu.com')

执行顺序:
1.执行父类的__init__方法实例化,过程中执行self.initialize
2.自定义有就执行自己的initialize,没有就执行父类的,内容为pass
3.根据请求方式执行对应方法

2面向对象进阶方法

class Foo:
    def __init__(self,name):
        self.name=name

    def __getitem__(self, item):
        print(self.__dict__[item])

    def __setitem__(self, key, value):
        self.__dict__[key]=value
    def __delitem__(self, key):
        print('del obj[key]时,我执行')
        self.__dict__.pop(key)
    def __delattr__(self, item):
        print('del obj.key时,我执行')
        self.__dict__.pop(item)

f1=Foo('sb')
f1['age']=18
f1['age1']=19
print(f1['age'])
del f1.age1
del f1['age']
f1['name']='alex'
print(f1.__dict__)

二,开始工作

***组件:***(将session保存在服务器本地内存)

#session.py
import time
import hashlib
containner={}
class Bar():
    def __init__(self,handler):
        self.handler=handler  #self.handler就是MainHandler对象,有set_cookie()方法
        self.random_str=None

        # 1.生成随机字符串
        # 2.写入用户cookie(只写一次)
        #先获取session_id,没有就算是新用户
        client_random_str=self.handler.get_cookie("session_id")
        if not client_random_str:
            '新用户'
            self.random_str = self.create_random_str()
            containner[self.random_str] = {}
        else:

            if client_random_str in containner: #判断合法
                '老用户'
                self.random_str=client_random_str
            else:
                '非法用户'
                self.random_str = self.create_random_str()
                containner[self.random_str] = {}
        ctime=time.time()
        self.handler.set_cookie("session_id",self.random_str,expires=ctime+1800)  #每一次访问后都发送,并设置超时时间30分钟
    def __getitem__(self, key):
        #获取session
        return containner[self.random_str].get(key)
    def __setitem__(self, key, value):
        # 3.后台存储
        containner[self.random_str][key]=value
    def __delitem__(self, key):
        #删除session
        del containner[self.random_str][key]

    def create_random_str(self):
        '生成随机字符串'
        Crutime=time.time()
        mm=hashlib.md5()
        mm.update(str(Crutime).encode("utf8"))
        return mm.hexdigest()
class FOO():
    def initialize(self):
        #self是MainHandler对象,有set_cookie()方法
        self.session=Bar(self)  #把self(MainHandler对象)传递给Bar
        super().initialize()   #广度查找

使用示例:

import tornado.ioloop
import tornado.web
from session import FOO
class MainHandler(FOO,tornado.web.RequestHandler):
    def get(self):
        self.session["xxx"]="tretwe" #这里的self.session已经是Bar()对象,会调用__setitem__
        self.redirect("/home")

class Homehandler(FOO,tornado.web.RequestHandler):
    def get(self):
        ff=self.session["xxx"]
        print(ff)
        if ff:
            self.write("欢迎")
        else:
            self.redirect("http://www.baidu.com")
settings={}
application = tornado.web.Application([
        (r"/index", MainHandler),
        (r"/home", Homehandler),
       ],**settings)

if __name__ == "__main__":
    application.listen(8888)
    tornado.ioloop.IOLoop.instance().start()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值