1.在带有(继承)自RequestHandler的类中
#设置
self.set_cookie('mycookie','hello_world',expires_days=10)#10天过期
#获取
info = self.get_cookie('mycookie')
2.由于tornado框架没有实现session的机制,我们就可以自己创建类来实现
#仅供参考
#MySeesion用来存储客户端信息
#存储格式:
# 键 id
# 值 {} #记录用户的行为
# 1345682423894:{'islogin':'True'}
# 192391280389e:{'aaa':'bbb','ccc':'ddd'}
from day0201.util.myutils import myuuid
session={}
#模拟实现session机制
class MySession:
def __init__(self,handler): #必须传递一个handler对象,才能在下面使用get_cookie()方法去实现
self.handler = handler
def __getitem__(self, key):
id = self.handler.get_cookie('cookieid')
if id:
#根据id取出对应的存储在服务器上的信息
info = session.get(id,None)
if info:
return info.get(key,None)
else:
return None
else:
return None
def __setitem__(self, key, value):
id = self.handler.get_cookie('cookieid')
if id:
info = session.get(id,None)
if info:
info[key] = value
else:
d = dict()
d[key] = value
session[id] = d
else:
d = dict()
d[key] = value
#为客户端指定一个uuid充当id值
id = myuuid() #这是一个具体的算法
session[id] = d
#并将id以cookie的形式写回给浏览器
self.handler.set_cookie('cookieid',id,expires_days=10)
以上session来时一个tornado的博客项目,完整的代码可以参见github地址
3.前端的实现
首先检测,如果登录则直接跳转到博客页
class IndexHandler(MyRequestHandler):
def initialize(self):
print('initialize方法执行')
#响应以get方式发起的请求
def get(self, *args, **kwargs):
print('get方法执行')
print('uuid值------>',myuuid())
#给浏览器一个cookie
self.set_cookie('mycookie','hello_world',expires_days=10)#10天过期
#session = MySession(self)
islogin = self.session['islogin']
if islogin:
self.redirect('/blog')
else:
#服务器给浏览器的响应内容
self.render('login.html')
#响应以post方式发起的请求
def post(self, *args, **kwargs):
pass
def on_finish(self):
print('on_finish方法执行')
博客页,如果没有登录,则跳转到登录页
class BlogHandler(MyRequestHandler):
def my_rand(self,a,b):
return random.randint(a,b)
def get(self, *args, **kwargs):
#session = MySession(self)
islogin = self.session['islogin']
if islogin:
self.render('blog.html')
else:
self.redirect('/')
def post(self, *args, **kwargs):
pass
class LoginHandler(MyRequestHandler):
def get(self, *args, **kwargs):
pass
def post(self, *args, **kwargs):
name = self.get_body_argument('name',None)
password = self.get_body_argument('password',None)
if self.application.dbutil.isloginsuccess(name,password):
#登录成功我要在session中进行记录
#session = MySession(self)
self.session['islogin'] = True
self.redirect('/blog')
else:
self.redirect('/?msg=fail')
其中的myRequestHandler是对requestHandler的再一次分装,不过的注意这个__init__()的参数传递
from tornado.web import RequestHandler
from day0201.util.mysession import MySession
class MyRequestHandler(RequestHandler):
def __init__(self,application, request, **kwargs):
super().__init__(application, request, **kwargs)
self.session = MySession(self)