session会话和cookie一起被称为会话跟踪技术,主要通过保存在服务器端的session数据和客户端浏览器的cookie数据共同完成用户访问服务器的足迹记录。
1. 什么是会话
会话session通常情况下,当客户端浏览器打开之后第一次访问服务器时,服务器会记录该浏览器客户端的信息,保存在服务器的session空间中,会话建立!
如果用户在打开的浏览器没有完全关闭(关闭所有的选项卡)的情况下,会保持会话,在访问服务器的过程中,会一直使用当前会话。如果完全关闭浏览器时客户端的session失效也就是会话失效了。
会话通常用于保存一些用户在访问服务器过程中频繁访问的数据或者记录访问过程中的一些状态数据的作用,诸如记录用户登录状态等等
2. tornado中的会话
tornado中默认不支持会话操作,通常情况下可以通过cookie或者secure cookie进行会话管理。
但是某些情况下我们不能否认,session操作能很方便的处理数据并且预防一些类似cookie伪造发起的攻击等等,所以我们在tornado中还是非常期望出现session会话管理的。
Congratulaions!tornado中,我们通过第三方模块来完成会话操作,tornado中主要通过我们之前学过的缓存数据库redis结合pycket模块来完成
3. 会话操作
首先在电脑上安装需要的模块,这里要安装主要的模块pycket,该模块封装了session的主要操作,模块中封装的保存数据的引擎对象,我们选择缓存数据库redis,so,在你的电脑上,也要安装好redis缓存数据库哦
PS:redis缓存数据库部分请参考《数据库》部分文档
# 安装pycket模块 > pip install pycket
安装好pycket模块之后,就可以通过该模块中的SessionMixin类进行session的管理操作了。
主要分两个操作步骤
- 通过self.session.set(name, value)设置值,通过self.session.get(name)获取值
- 在Application中添加pycket配置,完成数据存储引擎的配置
上干货:
# -*- coding:utf-8 -*- from tornado.web import Application, RequestHandler from tornado.ioloop import IOLoop from pycket.session import SessionMixin class IndexHandler(RequestHandler, SessionMixin): def get(self): self.session.set("login", self.get_argument("name")) self.write("index get ok!") class DetailHandler(RequestHandler, SessionMixin): def get(self): name = self.session.get("login") self.write("detail get ok! %s" % name) if __name__ == "__main__": import base64, uuid cookie_secret = base64.b64encode(uuid.uuid4().bytes) app = Application( [(r"/", IndexHandler), (r"/detail", DetailHandler)], cookie_secret=cookie_secret, pycket={ "engine": "redis", "storage": { "host": "localhost",# 设置redis主机 "port": 6379,# 设置链接端口 "max_connections": 2**64# 设置最大连接数 }, "cookies": { "expires_days": 2 # 设置过期时间 } } ) app.listen(8888) IOLoop.current().start()
4. 运行测试
打开浏览器,访问http://localhost:8888,会自动调用IndexHandler的get()方法,给session中存储数据
再次在浏览器地址栏中输入:http://localhost:8888/detail访问DetailHandler处理类获取session中存储的数据