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是保存在浏览器的一个键值对,每次的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,如需转载请自行联系原作者
目录
相关文章
|
4月前
|
数据采集 存储 Web App开发
Python爬虫技巧:设置Cookie永不超时的详细指南
Python爬虫技巧:设置Cookie永不超时的详细指南
|
3月前
|
数据采集 存储 数据库
Python爬虫开发:Cookie池与定期清除的代码实现
Python爬虫开发:Cookie池与定期清除的代码实现
|
4月前
|
Linux 数据库 数据安全/隐私保护
Python web Django快速入门手册全栈版,共2590字,短小精悍
本教程涵盖Django从安装到数据库模型创建的全流程。第一章介绍Windows、Linux及macOS下虚拟环境搭建与Django安装验证;第二章讲解项目创建、迁移与运行;第三章演示应用APP创建及项目汉化;第四章说明超级用户创建与后台登录;第五章深入数据库模型设计,包括类与表的对应关系及模型创建步骤。内容精炼实用,适合快速入门Django全栈开发。
119 1
|
3月前
|
数据采集 Web App开发 iOS开发
解决Python爬虫访问HTTPS资源时Cookie超时问题
解决Python爬虫访问HTTPS资源时Cookie超时问题
|
5月前
|
数据采集 自然语言处理 Java
Playwright 多语言一体化——Python/Java/.NET 全栈采集实战
本文以反面教材形式,剖析了在使用 Playwright 爬取懂车帝车友圈问答数据时常见的配置错误(如未设置代理、Cookie 和 User-Agent),并提供了 Python、Java 和 .NET 三种语言的修复代码示例。通过错误示例 → 问题剖析 → 修复过程 → 总结教训的完整流程,帮助读者掌握如何正确配置爬虫代理及其它必要参数,避免 IP 封禁和反爬检测,实现高效数据采集与分析。
254 3
Playwright 多语言一体化——Python/Java/.NET 全栈采集实战
|
5月前
|
数据采集 存储 NoSQL
Python爬虫Cookie管理最佳实践:存储、清理与轮换
Python爬虫Cookie管理最佳实践:存储、清理与轮换
|
11月前
|
设计模式 前端开发 数据库
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第27天】本文介绍了Django框架在Python Web开发中的应用,涵盖了Django与Flask等框架的比较、项目结构、模型、视图、模板和URL配置等内容,并展示了实际代码示例,帮助读者快速掌握Django全栈开发的核心技术。
615 45
|
11月前
|
API 开发者 Python
探索Python中的异步编程:Asyncio与Tornado的对决
在这个快节奏的世界里,Python开发者面临着一个挑战:如何让代码跑得更快?本文将带你走进Python异步编程的两大阵营——Asyncio和Tornado,探讨它们如何帮助我们提升性能,以及在实际应用中如何选择。我们将通过一场虚拟的“对决”,比较这两个框架的性能和易用性,让你在异步编程的战场上做出明智的选择。
|
11月前
|
安全 数据库 开发者
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第26天】本文详细介绍了如何在Django框架下进行全栈开发,包括环境安装与配置、创建项目和应用、定义模型类、运行数据库迁移、创建视图和URL映射、编写模板以及启动开发服务器等步骤,并通过示例代码展示了具体实现过程。
347 2
|
数据处理 开发者 Python
浅析Python中的异步编程:从asyncio到Tornado
Python的异步编程是提升应用性能的关键。本文从Python的异步编程概念入手,探讨了asyncio库的使用及其在实际开发中的应用,并分析了Tornado框架的异步模型,以及如何将异步思维运用于实际项目中。

热门文章

最新文章

推荐镜像

更多