WARNING!
阅读本文需要具有使用python编程的能力以及Web编程的经验,起码应该知道python是什么,Session是什么。初学者慎入,某些描述语焉不详,小心误入歧途,欢迎高手踊跃拍砖。本文代码仅仅作为示例使用,用于说明在tornado中实现session的过程以及方法,未经过任何编译或者运行,请勿直接copy到项目中使用,本人不对此行为造成的后果负任何责任。(此文实现内容源于商业项目,恕未能直接提供源码)
----------------------------------------------------------
tornado没有提供默认的会话,而很多敏感信息又没法用cookie存,tornado提供的secure_cookie只是解决了防止cookie篡改而没法阻止数据被解密为明文,所以我就给tornado写了一个session的包来解决这个问题。嗯,我们来看看是如何从底层一砖一瓦的来实现Session的功能。
根据项目的需要我采用Memcached作为Session的backend,当然你愿意用Mysql或者是其他什么能存储数据的东西都行,比如文本文件或者mongodb,选择很多,所以我们将Session需要持久化的操作独立出来成为一个可以替换的backend模块,我们可以根据配置使用不同的backend,由于python得ducktyping特性,要实现起来相当的简单,我们只需要提供包含如下三个方法签名的类就行了
class backend():
def getitem(self,key):
def setitem(self,key,value,timeout)
def deleteitem(self,key)
对于Memcached我们需要在backend类中保持一个Memcached的连接,大体上的实现如下:
from memcache import Client
class backend():
def __init__(self):
self.conn=Client([‘127.0.0.1:11211’])
def getitem(self,key):
return self.conn.get(key)
def setitem(self,key,value,timeout):
self.conn.set(key,value,timeout)
def deleteitem(self,key):
self.conn.delete(key)
当然实际应用中我们不会写得这么简陋了,连接的服务器信息都是从配置文件里取得的。这样我们就有了一个Session的backend了,如果你想用Mysql作为backend,那么可以按照这个原理来改写一个backend类
有了Session数据的持久化backend后我们就可以开始编写Session类本身了,首先我们来回顾一下Session的工作原理。基本上大部分的Session都是通过Cookie配置服务端持久化来实现Session的,cookie保持用户创建会话的SessionID,然后在每次访问的时候通过SessionID到持久化服务中去取这个Session的数据。当一个request开始的时候过程如下图:
当一个request结束之后,过程如下图:
理清楚处理的逻辑我们就能开始编码了,首先我们需要用一个对象来存储Session的数据,一般来说Session都按照Key-Value的形式存储,所以我们可以用一个Dict来作为Session的存储对象,但是我们还需要一个Session ID,所以我们继承一个dict
class SessionData(dict):
def __inti__(self,id=none):
self.id=id
def __getitem__(self,key):
if self.has_key(key):
return self[key]
return None
def __setitem__(self,key,value):
self[key]=value
然后我们实现一个decorator来在一个request前和request后来恢复和保存Session
def Session(request):
def Process(handler,*args):
#请求前恢复Session对象的过程
item=handler.application.backend.getitem(handler.get_secure_cookie(‘session_id’,’’))
data=None
if item:
data=new SessionData(item.id)
data.update(item)
else:
data=new SessionData()
handler.set_secure_cookie(“session_id”,””)
handler.setattr(“session”,data)
request(handler,*args)#执行原本请求的方法
#请求完成后保存session的过程
if data.id:
handler.application.backend.setitem(data.id,data)
else:
if len(data.keys()):
data.id=str(uuid1.uuid1())
handler.set_secure_cookie(“session_id”,data.id)
handler.application.backend.setitem(data.id,data)
这个方法有点长,不过逻辑就是这么样子的,实现了这个decreator之后我们只需要在需要使用Session的请求前加上@Session,就能够通过self.session来使用session咯。
接下来想在项目里使用还有一些具体的问题要解决,但是基本原理和实现方式在本文的内容就到此为止了,接下来的工作应该难不倒能看懂此文的同学,如果看着如同天书,那么多半是对python或者tornado没有什么了解,请自行弥补基础知识。希望此文能够对正在实践python和tornado的TX有所帮组
分享到:
相关推荐
人工智能-项目实践-tornado-基于Tornado实现,系统核心调度,可分布式扩展 修改配置 对settings 里面的配置文件进行修改,主要是数据库 缓存 消息队列 修改 doc/nginx_ops.conf 的server_name 例如 改为 task....
文件名 "tornado-master" 表示这是一个 Tornado 的源码仓库主分支,可能包含了实现 session 支持的修改和改进。如果你打算使用这个版本,你可以通过阅读源码、查看文档或者参与社区讨论来了解具体如何集成和使用 ...
资源分类:Python库 所属语言:Python 资源全名:tornado-redis-session-0.1.3.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
VxWorks 是由美国WRS (风河)公司开发的一个运行在目标机上的高性能、可裁剪的 嵌入式实时操作系统。目前我们使用的Tornado集成开发环境为设计VxWorks应用程序提供 了一套高效、实用的调试手段和方法。
ubuntu-python3-whisper-tornado docker镜像 Dockerfile
ubuntu-python3-whisper-tornado docker镜像,可下载直接使用
ubuntu-python3-whisper-tornado docker镜像,可下载直接使用
ubuntu-python3-whisper-tornado docker镜像,可下载直接使用
《PyPI官网下载 | pysolr-tornado-4.0.0a2.tar.gz - Python库解析》 PyPI(Python Package Index),是Python社区官方的软件包仓库,提供了丰富的Python库供开发者下载和使用。在给定的资源中,“pysolr-tornado-...
tornado-boilerplate, Tornado 应用程序的标准布局 龙卷风样板--是 Tornado 应用的标准布局描述龙卷风样板是为 Tornado 应用程序布局建立一个惯例,帮助编写实用程序来部署这些应用程序。 一点约定可能会很长。这里...
dp-tornado-0.3.9可能集成了对Zookeeper的支持,允许Tornado应用与其他分布式服务进行通信,实现服务发现、配置管理等功能,从而提高系统的可扩展性和可靠性。 Python作为一门动态类型、面向对象的编程语言,因其...
项目使用高性能异步服务器框架Tornado来实现,在单个Tornado实例下,4核Intel i7 cpu可以达到1000-3000 的QPS 功能模块: # 授权模块 * 登陆 * 注册 * 注销 * 验证码 # 问题模块 * 问题列表 * 问题分页 * 问题...
Tornado包括项目管理器、源代码编辑器、编译器、链接器、加载器、目标模拟器、调试器等多个组件,支持C和C++语言,确保了高效的软件开发流程。 在VxWorks中,关键特性包括: 1. **实时响应**:VxWorks提供硬实时...
3. **WebSocket 支持**:Tornado 支持WebSocket协议,允许双向通信,为实时应用如聊天室、股票报价等提供了便利。 4. **模板引擎**:Tornado 自带了简单的模板语言,方便开发者快速生成 HTML 页面。 5. **强大的...