2Python全栈之路系列之Tornado的Cookie与Sess

简介:

Python全栈之路系列之Tornado的Cookie与Sess


主要的代码结构为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/usr/bin/env python
# _*_coding:utf-8 _*_
 
import  tornado.ioloop
import  tornado.web
 
class  MainHandler(tornado.web.RequestHandler):
     def  get( self * args,  * * kwargs):
         """
         这里的代码将操作cookie与session
         """
         self .write( 'Hello World' )
         
application  =  tornado.web.Application([
     (r '/' , MainHandler),
])
 
if  __name__  = =  "__main__" :
     print ( 'http://127.0.0.1:8888/' )
     application.listen( 8888 )
     tornado.ioloop.IOLoop.instance().start()

Cookie的操作

COokie是保存在浏览器的一个键值对,每次的HTTP请求都会携带Cookie

获取所有的Cookies

1
self .cookies

设置Cookie

1
self .set_cookie( self , name, value, domain = None , expires = None , path = "/" , expires_days = None * * kwargs)

可接受的参数描述:

参数 描述
name Cookie的Key
value Cookie的value
domain 生效的域名
expires 以秒为过期时间,默认从1970-01-01T00:00:10.000Z
path 生效路径
expires_days 以天数过期时间,如果设置为None则关闭浏览器Cookie就失效

设置cookie过期时间为15分钟以后的代码为:

1
self .set_cookie( 'key' 'value' , expires = time.time() + 900 )

MainHandler的代码

1
2
3
4
5
6
7
8
9
10
11
12
class  MainHandler(tornado.web.RequestHandler):
     def  get( self * args,  * * kwargs):
         # 获取cookie,如果没有获取到,值就是None
         if  self .get_cookie( 'key' None = =  None :
             # 设置一个cookie
             self .set_cookie( 'key' 'val' )
             STRING  =  'Hello World'
         else :
             # 获取cookie的值赋给STRING
             STRING  =  self .get_cookie( 'key' )
         # 如果没有获取到Cookie则输出'Hello World',否则就输出Cookie的值
         self .write(STRING)

加密的Cookie

要使用加密的Cookie,你需要在创建应用时提供一个密钥,名字为cookie_secret, 你可以把它作为一个关键词参数传入应用的设置中:

1
2
3
application  =  tornado.web.Application([
     (r '/' , MainHandler),
], cookie_secret = "508CE6152CB93994628D3E99934B83CC" )

设置一个加密Cookie所需要的参数

1
self .set_secure_cookie( self , name, value, expires_days = 30 , version = None * * kwargs):

参数和上面的大同小异。

MainHandler的代码

1
2
3
4
5
6
7
8
9
10
11
12
class  MainHandler(tornado.web.RequestHandler):
     def  get( self * args,  * * kwargs):
         # 获取cookie,如果没有获取到,值就是None
         if  self .get_secure_cookie( 'key' None = =  None :
             # 设置一个cookie
             self .set_secure_cookie( 'key' 'val' )
             STRING  =  'Hello World'
         else :
             # 获取cookie的值赋给STRING
             STRING  =  self .get_secure_cookie( 'key' )
         # 如果没有获取到Cookie则输出'Hello World',否则就输出Cookie的值
         self .write(STRING)

签名的Cookie流程:

写cookie过程:

  1. 将值进行base64加密

  2. 对除值以外的内容进行签名,哈希算法(无法逆向解析)

  3. 拼接 签名 + 加密值

读cookie过程:

  1. 读取签名 + 加密值

  2. 对签名进行验证

  3. base64解密,获取值内容

基于Cookie的用户登陆实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# app01.py
#!/usr/bin/env python
# _*_ coding: utf-8 _*_
 
import  tornado.web
import  tornado.ioloop
 
class  IndexHandler(tornado.web.RequestHandler):
     def  get( self ):
         self .set_secure_cookie( 'username' 'ansheng' )
         self .set_secure_cookie( 'password' 'hello' )
         self .render( 'index.html' )
         
     def  post( self * args,  * * kwargs):
         username  =  self .get_argument( 'username' None )
         password  =  self .get_argument( 'password' None )
         cooike_user  =  str ( self .get_secure_cookie( 'username' ), encoding = 'utf-8' )
         cooike_pass  =  str ( self .get_secure_cookie( 'password' ), encoding = 'utf-8' )
         if  username  = =  cooike_user  and  password  = =  cooike_pass:
             self .write( 'Hello '  +  cooike_user)
         else :
             self .write( '用户名或密码错误' )
             
settings  =  {
     'template_path' 'template' ,
}
 
application  =  tornado.web.Application([
     (r '/' , IndexHandler),
],  * * settings,
     cookie_secret = "508CE6152CB93994628D3E99934B83CC" )
     
if  __name__  = =  '__main__' :
     print ( 'http://127.0.0.1:8000' )
     application.listen( 8000 )
     tornado.ioloop.IOLoop.instance().start()

HTML文件内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<! - -  index.html  - - >
<!DOCTYPE html>
<html lang = "en" >
<head>
     <meta charset = "UTF-8" >
< / head>
<body>
 
<form method = "post"  action = "/" >
     < input  type = "text"  name = "username"  / >
     < input  type = "text"  name = "password"  / >
     < input  type = "submit"  value = "提交"  / >
< / form>
 
< / body>
< / html>

演示结果如下:
wKiom1kVet3BT1DZAAFVzoyXN4g002.gif

Session

Tornado中是不提供像Cookie这种直接设置Session的,需要我们自己写插件来进行对Session的增删改

Session的数据是保存在服务端的,如果要应用Session必须要依赖Cookie,因为Cookie的值就等于Session的Key

Session在内存中的存储方式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
key(随机字符串)  =  {
     { 'k1' , 'v1' },
     { 'k2' , 'v2' },
     { 'k3' , 'v3' },
     ....
}
 
key(随机字符串)  =  {
     { 'k1' , 'v1' },
     { 'k2' , 'v2' },
     { 'k3' , 'v3' },
     ....
}
 
key(随机字符串)  =  {
     { 'k1' , 'v1' },
     { 'k2' , 'v2' },
     { 'k3' , 'v3' },
     ....
}
.....

一个设置与获取Session的小脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#!/usr/bin/env python
# _*_ coding: utf-8 _*_
 
import  tornado.web
import  tornado.ioloop
 
container  =  {}
 
class  Session:
     def  __init__( self , Handler):
         self .Handler  =  Handler
         self .random_str  =  None
         
     # 随机字符串
     def  __genarate_random_str( self ):
         import  hashlib
         import  time
         obj  =  hashlib.md5()
         obj.update(bytes( str (time.time()), encoding = 'utf-8' ))
         random_str  =  obj.hexdigest()
         return  random_str
         
     def  __setitem__( self , key, value):
         if  self .random_str  = =  None :
             random_str  =  self .Handler.get_cookie( 'uc' )
             if  not  self .random_str:
                 random_str  =  self .__genarate_random_str()
                 container[random_str]  =  {}
                 
             else :
                 if  self .random_str  in  container.keys():
                     pass
                 else :
                     random_str  =  self .__genarate_random_str()
                     container[random_str]  =  {}
             self .random_str  =  random_str
             
         container[ self .random_str][key]  =  value
         # 浏览器写入Cookie
         self .Handler.set_cookie( 'uc' self .random_str)
         
     def  __getitem__( self , key):
         random_str  =  self .Handler.get_cookie( 'uc' )
         if  not  random_str:
             return  None
         user_info_dict  =  container.get(random_str,  None )
         if  not  user_info_dict:
             return  None
         value  =  user_info_dict.get(key,  None )
         return  value
         
class  BashHandler(tornado.web.RequestHandler):
     def  initialize( self ):
         self .session  =  Session( self )
         
class  SetHandler(BashHandler):
     def  get( self * args,  * * kwargs):
         self .session[ 'Hello' =  'World'
         self .write( 'OK' )
         
class  GetHandler(BashHandler):
     def  get( self * args,  * * kwargs):
         val  =  self .session[ 'Hello' ]
         self .write(val)
         
application  =  tornado.web.Application([
     (r '/set' , SetHandler),
     (r '/get' , GetHandler),
])
if  __name__  = =  '__main__' :
     print ( 'http://127.0.0.1:8000' )
     application.listen( 8000 )
     tornado.ioloop.IOLoop.instance().start()









本文转自 Edenwy  51CTO博客,原文链接:http://blog.51cto.com/edeny/1925121,如需转载请自行联系原作者
目录
相关文章
|
8月前
|
Python
python中3种获取cookie解决方案
python中3种获取cookie解决方案
127 0
|
9天前
|
JavaScript 前端开发 Docker
全栈开发实战:结合Python、Vue和Docker进行部署
【4月更文挑战第10天】本文介绍了如何使用Python、Vue.js和Docker进行全栈开发和部署。Python搭配Flask创建后端API,Vue.js构建前端界面,Docker负责应用的容器化部署。通过编写Dockerfile,将Python应用构建成Docker镜像并运行,前端部分使用Vue CLI创建项目并与后端交互。最后,通过Nginx和另一个Dockerfile部署前端应用。这种组合提升了开发效率,保证了应用的可维护性和扩展性,适合不同规模的企业使用。
|
27天前
|
Python
老男孩&路飞学城Python全栈
老男孩&路飞学城的Python全栈开发重点班由ALEX老师主讲,核心教学内容,100多天课程,近100G资料,含基础到实战。一线技术专家亲授,以案例教学引导学生逐步进入项目实战。
20 1
老男孩&路飞学城Python全栈
|
1月前
|
物联网 调度 开发者
构建高效Python Web应用:异步编程与Tornado框架解析
【2月更文挑战第27天】 在处理高并发的Web应用场景时,传统的同步阻塞模型往往难以满足性能需求。本文将深入探讨Python世界中的异步编程概念,并结合Tornado这一轻量级、非阻塞式Web服务器及框架,展示如何构建高性能的Web应用。通过实例驱动的方法论,我们将剖析Tornado的核心组件,包括其IOLoop、异步HTTP客户端和服务器端处理机制,以及与协程集成的细节。文章旨在为开发者提供一套实践指南,帮助他们利用Python实现快速响应和资源高效的Web服务。
28 2
|
1月前
|
数据采集 存储 安全
登录态数据抓取:Python爬虫携带Cookie与Session的应用技巧
登录态数据抓取:Python爬虫携带Cookie与Session的应用技巧
|
1月前
|
存储 搜索推荐 安全
Python中的Cookie模块有什么功能
Python中的Cookie模块有什么功能
26 0
|
1月前
|
监控 调度 开发者
构建高效Python Web应用:异步编程与Tornado框架深度解析
【2月更文挑战第20天】在处理高并发的Web应用时,传统的同步阻塞模型往往难以满足性能要求。本文将深入探讨Python异步编程的原理及其优势,并通过Tornado框架的案例分析,展示如何构建一个高效的异步Web服务。我们将从异步IO的基础讲起,逐步过渡到Tornado的核心组件,最终实现一个能够承载大量并发连接的Web服务器,为追求高性能Web解决方案的开发者提供实践指南。
|
3月前
|
监控 安全 前端开发
Python全栈安全:构建安全的全栈应用
Python全栈安全:构建安全的全栈应用
38 0
|
5月前
|
存储 安全 数据安全/隐私保护
13 Tornado - Cookie
13 Tornado - Cookie
18 2
|
8月前
|
存储 中间件 数据库
[Python]Django会话保持(cookie & session)(二)
[Python]Django会话保持(cookie & session)(二)