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

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介:

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是保存在浏览器的一个键值对,每次的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_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过程:

  1. 将值进行base64加密

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

  3. 拼接 签名 + 加密值

读cookie过程:

  1. 读取签名 + 加密值

  2. 对签名进行验证

  3. base64解密,获取值内容

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,如需转载请自行联系原作者
目录
相关文章
|
9天前
|
设计模式 前端开发 数据库
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第27天】本文介绍了Django框架在Python Web开发中的应用,涵盖了Django与Flask等框架的比较、项目结构、模型、视图、模板和URL配置等内容,并展示了实际代码示例,帮助读者快速掌握Django全栈开发的核心技术。
87 44
|
10天前
|
安全 数据库 开发者
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第26天】本文详细介绍了如何在Django框架下进行全栈开发,包括环境安装与配置、创建项目和应用、定义模型类、运行数据库迁移、创建视图和URL映射、编写模板以及启动开发服务器等步骤,并通过示例代码展示了具体实现过程。
26 2
|
6月前
|
缓存 自然语言处理 数据库
构建高效Python Web应用:异步编程与Tornado框架
【5月更文挑战第30天】在追求高性能Web应用开发的时代,异步编程已成为提升响应速度和处理并发请求的关键手段。本文将深入探讨Python世界中的异步编程技术,特别是Tornado框架如何利用非阻塞I/O和事件循环机制来优化Web服务的性能。我们将剖析Tornado的核心组件,并通过实例演示如何构建一个高效的Web服务。
|
2月前
|
数据处理 开发者 Python
浅析Python中的异步编程:从asyncio到Tornado
Python的异步编程是提升应用性能的关键。本文从Python的异步编程概念入手,探讨了asyncio库的使用及其在实际开发中的应用,并分析了Tornado框架的异步模型,以及如何将异步思维运用于实际项目中。
|
25天前
|
Python
python中3种获取cookie解决方案
python中3种获取cookie解决方案
17 0
|
3月前
|
JSON 数据库 开发者
FastAPI入门指南:Python开发者必看——从零基础到精通,掌握FastAPI的全栈式Web开发流程,解锁高效编码的秘密!
【8月更文挑战第31天】在当今的Web开发领域,FastAPI迅速成为开发者的热门选择。本指南带领Python开发者快速入门FastAPI,涵盖环境搭建、基础代码、路径参数、请求体处理、数据库操作及异常处理等内容,帮助你轻松掌握这一高效Web框架。通过实践操作,你将学会构建高性能的Web应用,并为后续复杂项目打下坚实基础。
99 0
|
3月前
|
测试技术 数据库 开发者
Python全栈测试开发Chapter11 Mock测试
总结起来,Mock测试是一种有效的隔离测试环境、提高测试效率的方法,它让我们能够在不依赖外部条件的情况下进行全面的单元测试。在Python全栈测试中,Mock的应用是一种非常实用的技能。
24 0
|
5月前
|
前端开发 JavaScript 测试技术
Python中的全栈开发
【6月更文挑战第6天】本文探讨了Python在全栈开发中的应用,展示了如何利用Python的Django和Flask框架进行后端开发,以及与JavaScript前端框架的集成。文中通过示例介绍了Django和Flask的基本用法,并讨论了全栈开发中的前端集成、CORS问题、数据传输、身份验证、异步编程、性能优化、日志记录、错误处理、测试、安全性、数据库集成、实时通信、缓存和扩展功能。此外,还强调了全栈开发涉及的团队协作、项目管理和用户体验,指出Python为全栈开发提供了强有力的支持。
59 5
|
5月前
|
前端开发 JavaScript Python
Python之Tornado web 框架详解
Python之Tornado web 框架详解
42 0
|
6月前
|
安全 前端开发 JavaScript
Python 全栈安全(三)(4)
Python 全栈安全(三)
25 1
下一篇
无影云桌面