一,准备工作:
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()