【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()
自定义Session简单版
#!/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()
自定义Session基本完整版
v1|加密串|时间戳
【python之路45】tornado的用法 (三)的更多相关文章
- 百万年薪python之路 -- socket()模块的用法
socket()模块的用法: import socket socket.socket(socket_family,socket_type,protocal=0) socket_family 可以是 A ...
- 百万年薪python之路 -- 并发编程之 多线程 三
1. 阻塞,非阻塞,同步,异步 进程运行的三个状态: 运行,就绪,阻塞. 从执行的角度: 阻塞: 进程运行时,遇到IO了,进程挂起,CPU被切走. 非阻塞: 进程没有遇到IO 当进程遇到IO, ...
- 【python之路44】tornado的用法 (二)
参考:https://www.cnblogs.com/sunshuhai/articles/6253815.html 一.代码目录构建 代码目录设置如下图: #!/usr/bin/env python ...
- 【python之路43】tornado的用法(一)
一.tonado的代码 1.返回字符串 #!/usr/bin/env python # -*- coding:utf-8 -*- import tornado.ioloop import tornad ...
- Python之路【第二十篇】Tornado框架
Tornado Tornado是使用Python编写的一个强大的.可扩展的Web服务器.它在处理严峻的网络流量时表现得足够强健,但却在创建和编写时有着足够的轻量级,并能够被用在大量的应用和工具中. 我 ...
- 【Python之路】第十六篇--Web框架之Tornado
概述 Tornado 是 FriendFeed 使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本.这个 Web 框架看起来有些像web.py 或者 Google 的 webapp,不过为了 ...
- 【python之路42】web框架们的具体用法
Python的WEB框架 (一).Bottle Bottle是一个快速.简洁.轻量级的基于WSIG的微型Web框架,此框架只由一个 .py 文件,除了Python的标准库外,其不依赖任何其他模块. p ...
- python之路 目录
目录 python python_基础总结1 python由来 字符编码 注释 pyc文件 python变量 导入模块 获取用户输入 流程控制if while python 基础2 编码转换 pych ...
- Python之路【第十八篇】:Web框架们
Python之路[第十八篇]:Web框架们 Python的WEB框架 Bottle Bottle是一个快速.简洁.轻量级的基于WSIG的微型Web框架,此框架只由一个 .py 文件,除了Pytho ...
随机推荐
- django中写form表单时csrf_token的作用
之前在学习django的时候,在template中写form时,出现错误.百度,google后要加{% csrf_token %}才可以,之前一直也没研究,只是知道要加个这个东西,具体是什么也不明白. ...
- java_新特性未整理
得到的.className method.isAnnotationPresent:判断是否有指定的注解,注解.class method.invoke:执行 */}
- iOS开发系列-网络状态监控
概述 在网络应用中,需要对用户设别的网络状态进行实时监控,可以让用户了解自己的网络状态出现网络问题提示用户. 一般在网络状态不好的场景下需要做一些处理比如: WIFT/3G/4G网络:自动下载高清图. ...
- JS规则 我还有其它用途( +号操作符)例如,算术操作符(+、-、*、/等),比较操作符(<、>、>=、<=等),逻辑操作符(&&、||、!)
我还有其它用途( +号操作符) 操作符是用于在JavaScript中指定一定动作的符号. (1)操作符 看下面这段JavaScript代码. sum = numa + numb; 其中的"= ...
- vertx使用过程中浏览器端Cookie重复问题
[问题描述] 背景: 使用vertx提供的服务,使用Dispatcher做路由转发,内部通过routingcontext做请求传递及响应. 现象: 在谷歌浏览器的Network中,看到Cookie中有 ...
- 【转载】linux文件系统简介
文件系统是linux的一个十分基础的知识,同时也是学习linux的必备知识. 本文将站在一个较高的视图来了解linux的文件系统,主要包括了linux磁盘分区和目录.挂载基本原理.文件存储结构.软链接 ...
- DISTINCT 方法用于返回唯一不同的值 。
DISTINCT 方法用于返回唯一不同的值 . 例如: $Model->distinct(true)->field('name')->select(); 生成的SQL语句是: SEL ...
- C语言利用动态数组实现顺序表(不限数据类型)
实现任意数据类型的顺序表的初始化,插入,删除(按值删除:按位置删除),销毁功能.. 顺序表结构体 实现顺序表结构体的三个要素:(1)数组首地址:(2)数组的大小:(3)当前数组元素的个数. //顺序表 ...
- Android 之 BroadcaseReceiver
1.在AndroidManifest.xml中注册 <receiver android:name=".MyReceiver"> <intent-filter &g ...
- lavarel中如何使用memcache
lavarel中如何使用memcache 一.总结 一句话总结: composer下载包,配置,使用函数 1.memcache是什么? 键值对内存缓存 MemCache是一个自由.源码开放.高性能.分 ...