【python之路45】tornado的用法 (三)
参考:https://www.cnblogs.com/sunshuhai/articles/6253815.html
一、cookie用法补充
1、cookie的应用场景
浏览器端保存的键值对,每次访问都会携带
1)用户验证,多长时间内免登陆
2)后台管理,左侧隐藏,可以把隐藏的键值对保存在cookie中
3)每页显示多少条数据也可以保存在cookie中
设置cookie的方法:
2、tornado在后台进行设置
self.cookies #获取所有的cookie
self.setcookie("k1","999") #设置cookie
self.getcookie("k1") #获取某个cookie
3、浏览器端使用javascript进行设置或获取
document.cookie //获取所有cookie,返回的是字符串格式:"k1=9999",如果想获取k1的值,则通过处理字符串
document.cookie = "k2=666" //设置cookie,增加键值对 "k2=666"
//重新获取下
document.cookie //结果:"k1=9999; k2=666"
document.cookie = "k3=888;paht=/" //表示增加键值对"k3=888",并且设置路径为全路径,再次获取时path是获取不到的,path表示参数设置
<script> //设置cookie并设置超时时间 function setCookie(name,value,expires) { //获取当前的时间 var current_date = new Date(); //当前时间的基础上+5秒 current_date.setSeconds(current_date.getSeconds() + expires) //当前时间的基础上+5天 //current_date.setDate(current_date.getDate() + expires) //设置cookie,并且设置超时时间为当前时间+5s //document.cookie = "k4=444;expires =" + current_date.toUTCString(); document.cookie = name + "= " + value + ";expires=" + current_date.toUTCString(); } </script>
setCookie("k4","111",10) //增加cookie键值对"k4=111" 并且设置10秒钟后失效
document.cookie = "k5=555;domain=ssh.com" //增加cookie键值对"k5=555" 并且设置域名为 ssh.com
secure https使用
4、浏览器Jquery操作cookie的方法
首先使用Jquery中的cookie,先要下载静态文件jquery文件,并且引入
再次,要下载Jquery制定的插件jQuery Cookie,下载地址,下载完毕后引用该静态文件
导入Jquery和jQuery Cookie后就可以使用了
$cookie("k6","6666") //增加设置cookie键值对"k6=666"
$cookie("k7","777",{'path' :' ', 'domain' : '', 'expires' : 7}) //设置cookie ,并设置路径,域名,超时时间(是按照天数计算)
$cookie("k8","888",{'expires' : 7}) //表示7天后过期
如果想设置为6秒后过期,代码如下:
var current_date = new Date();
current_date.second(current_date.getSeconds() + 6);
$.cookie('k1','v1',{'expires' : current_date})
5、tornado带签名cookie原理
tornado的加密原理:
k1=v1 把v1做一个base64的加密
v1|v1+时间戳+自定义字符串,然后把v1+时间戳+自定义字符串生成一个加密串
v1|加密串|时间戳
self.set_secure_cookie("k1","v1") #设置带签名的cookie
self.get_secure_cookie("k1") #返回的类型为字节类型
str(self.get_secure_cookie("k1"),encoding="utf-8") == "v1" #判断获取的带前面的值解密后是否等于v1
6、自定义Session
tornado本身是没有Session功能的,如果使用Session需要自定义Session
其实Session是随机产生的一个字符串,用户登录后随机产生一个字符串作为Cookie,后台随机产生的Cookie与改用户的账户信息进行关联,前台携带这个Cookie来登录时通过这个随机字符串,来找到账户信息,从而返回该用户的其他信息。
下面是Session的一个简单的例子:
#!/usr/bin/env python # -*- coding:utf-8 -*- import tornado.ioloop import tornado.web import hashlib import time container = {} class IndexHandler(tornado.web.RequestHandler): def get(self): ses = str(self.get_cookie("session",None)) if ses in container: self.redirect('/manager') else: if self.get_argument('u',None) in ['alex','eric']: obj = hashlib.md5() bb =bytes(str(time.time()),encoding='utf-8') obj.update(bb) random_str = obj.hexdigest() container[random_str] = {} container[random_str]['account']= self.get_argument('u',None) container[random_str]['islogin']=True self.set_cookie('session',random_str) else: self.write("请登录") class ManagerHandler(tornado.web.RequestHandler): def get(self): ses = str(self.get_cookie("session",None)) if ses in container: self.write(container[ses]['account'] + '已登录到管理账户') settings = { 'template_path':'views', } #路由映射 application = tornado.web.Application([ (r"/index", IndexHandler), (r'/manager',ManagerHandler), ],**settings) if __name__ == "__main__": application.listen(8888) tornado.ioloop.IOLoop.instance().start()
#!/usr/bin/env python # -*- coding:utf-8 -*- import tornado.ioloop import tornado.web container={} class Session: def __init__(self,handler): self.handler = handler self.random_hex = None def __genarate_random_str(self): import hashlib import time obj = hashlib.md5() random_str = bytes(str(time.time()), encoding='utf-8') obj.update(random_str) random_hex = obj.hexdigest() return random_hex #def set_value(self,key,value): def __setitem__(self, key, value): #为随机字符串key对应的value字典添加{key,value} if not self.random_hex: random_hex = self.handler.get_cookie("session") if not random_hex: #客户端没有随机字符串,则创建 random_hex = self.__genarate_random_str() container[random_hex] = {} else: #客户端有随机字符串,如果不在container内也需要创建 if random_hex not in container: random_hex = self.__genarate_random_str() container[random_hex] = {} self.random_hex = random_hex # container={srandom_hex:{key:value}} container[self.random_hex][key] = value self.handler.set_cookie("session",self.random_hex) #访问后重新设置cookie,超时时间继续延长 #def get_value(self,key): def __getitem__(self, key): random_str = self.handler.get_cookie("session", None) #获取浏览器的字符串,并且字符串在container内 if random_str and random_str in container: value = container[random_str].get(key,None) return value else: return None class BaseHandler(tornado.web.RequestHandler): def initialize(self): self.session = Session(self) class IndexHandler(BaseHandler): def get(self): user = self.get_argument('u') if user in ['alex','sunshuhai']: #self.session.set_value('islogin',True) #self.session.set_value('user',user) #第2次没发请求 self.session['islogin'] = True self.session['user']=user print(container) else: self.write("请登录!") class ManagerHandler(BaseHandler): def get(self): getValue = self.session["islogin"] if getValue: self.write( '已登录到管理账户') else: self.write('登录失败!') settings = { 'template_path':'views', } #路由映射 application = tornado.web.Application([ (r"/index", IndexHandler), (r'/manager',ManagerHandler), ],**settings) if __name__ == "__main__": application.listen(8888) tornado.ioloop.IOLoop.instance().start()
v1|加密串|时间戳