Tornado之Session实现
Tornado框架中,默认执行Handler的get/post等方法之前默认会执行 initialize方法,所以可以通过自定义的方式使得所有请求在处理前执行操作

import tornado.ioloop
import tornado.web import time
import hashlib # 将session_id保存在内存中
class Cache(object):
def __init__(self):
self.container = dict() def __contains__(self, item):
return item in self.container def initial(self,random_str):
self.container[random_str] = dict() def get(self,random_str,key):
return self.container[random_str].get(key) def set(self,random_str,key,value):
self.container[random_str][key] = value def delete(self,random_str,key):
del self.container[random_str][key] def open(self):
pass def close(self):
pass def clear(self,random_str):
del self.container[random_str] db = Cache # 这里的Cache可以换成任何其他想要的Session存储方式,这里为了演示方便就直接保存在内存中了 class Session(object):
def __init__(self, handler):
self.handler = handler
self.random_str = None
self.db = db()
# 去用户请求信息中获取session_id,如果没有,表示是新用户
client_random_str = self.handler.get_cookie("session_id")
if not client_random_str:
# 新用户
self.random_str = self.create_random_str()
self.db.initial(self.random_str) else: # 检查随机字符串是否在字典中,防止用户自己伪造session_id值
if client_random_str in self.db:
# 老用户
self.random_str = client_random_str
else:
# 非法用户 重新为其赋值
self.random_str = self.create_random_str()
self.db.initial(self.random_str) ctime = time.time()
# 往客户端浏览器设置session_id
self.handler.set_cookie("session_id", self.random_str, expires=ctime+1800) def create_random_str(self):
value = str(time.time())
m = hashlib.md5()
m.update(bytes(value, encoding="utf-8"))
return m.hexdigest() def __setitem__(self, key, value): self.db.set(self.random_str, key, value) def __getitem__(self, key): return self.db.get(self.random_str, key) def __delitem__(self, key): self.db.delete(self.random_str, key) def clear(self): self.db.clear(self.random_str) class Foo(object):
def initialize(self):
self.session = Session(self) # 这里是一个重点,Foo作为HomeHandler的父类,因此这里的"self"就是HomeHandler的对象,所以可以调用"self.set_cookie()",把
super(Foo, self).initialize() # "self"传递给Session(),通过"handler"接收,这样就可以在Session()中调用"self.set_cookie()"了 class LoginHandler(Foo, tornado.web.RequestHandler):
def get(self):
self.session["user"] = "root" # 为了演示方便,这里就不去数据库查找用户名和密码了,直接赋值
self.redirect("/home") class HomeHandler(Foo, tornado.web.RequestHandler):
def get(self):
user = self.session["user"]
if not user:
self.redirect("https://www.biying.com") self.write("欢迎登陆:" + user) class MainHandler(Foo, tornado.web.RequestHandler):
def get(self):
# self.write("Hello, world")
self.render("main.html") settings = {
"template_path":"views",
} application = tornado.web.Application([
(r"/index", MainHandler),
(r"/login", LoginHandler),
(r"/home", HomeHandler),
], **settings) if __name__ == "__main__":
application.listen(8888)
tornado.ioloop.IOLoop.instance().start()
Tornado之Session实现的更多相关文章
- 第二百六十九节,Tornado框架-Session登录判断
Tornado框架-Session登录判断 Session需要结合cookie来实现 Session的理解 1.用户登录系统时,服务器端获取系统当前时间,进行nd5加密,得到加密后的密串 2.将密串作 ...
- Tornado 自定义session,与一致性哈希 ,基于redis 构建分布式 session框架
Tornado 自定义session,与一致性哈希 ,基于redis 构建分布式 session import tornado.ioloop import tornado.web from myhas ...
- tornado自定义session
这开始之前我们先了解以下什么是cookie和session 简单的说: cookie是保存在客户端的键值对 session是保存在服务端的键值对 session依赖与cookie 在Django中,可 ...
- 自定义Tornado的session组件
session和cookie的关系 cookie:保存在客户端浏览器上的键值对 session_id = "eyJ1c2VyX2luZm8iOiJ" session:保存在服务器上 ...
- 关于tornado中session的总结
#!/usr/bin/env python# _*_ coding:utf-8 _*_ import tornado.webimport tornado.ioloop container = {} # ...
- tornado 自定义session (二)
有了上一步的基础,我们将session改造成一个模块,这样我们就可以通过配置,来使用不同方式(redis,数据库等)的session. 添加一个新目录:TornadoSession conf.py是配 ...
- tornado 自定义session (一)
tornado 中没有session功能,需要我们自己实现. 目录: settings: settings = { 'template_path': 'templates', 'static': 's ...
- tornado session
[转]tornado入门 - session cookie 和session 的区别: 1.cookie数据存放在客户的浏览器上,session数据放在服务器上. 2.cookie不是很安全,别人可以 ...
- Session for Tornado(Redis) - 代码分享
Session for Tornado(Redis) - 代码分享 Session for Tornado(Redis) session id的生成借用了web.py. 使用了 redis 的 h ...
随机推荐
- js判断是Android还是iOS
var u = navigator.userAgent, app = navigator.appVersion; var isAndroid = u.indexOf('Android') > - ...
- Struts笔记5
文件下载 1.写action类 package com.gyf.web.action; import java.io.File; import java.io.FileInputStream; imp ...
- 04 IO流(二)——IO类的记忆方法、使用场景
关于IO流以前写的PPT式笔记请跳转:https://blog.csdn.net/SCORPICAT/article/details/87975094#262___1451 IO流的主要结构 记忆方法 ...
- PAT甲级题分类汇编——线性
本文为PAT甲级分类汇编系列文章. 线性类,指线性时间复杂度可以完成的题.在1051到1100中,有7道: 题号 标题 分数 大意 时间 1054 The Dominant Color 20 寻找出现 ...
- vue+iview+mock模拟数据遍历
下载安装iview, 进入根目录,用命令行启动 npm install npm run build npm run dev 安装mock.js和axios npm install mock.js -s ...
- shell 学习笔记4-shell内置变量命令
一.shell 的一些内置命令 常用的一内部命令有:echo.eval.exec.export.read.shift 1.echo命令-在屏幕中输出信息 1)说明 格式:echo args #< ...
- webstorm最新激活码2019----亲测可用
亲测日期:2019.12.10 网址里面有 lookdiv.com 里面的钥匙就是lookdiv.com
- 前端开发 Vue -4promise解读2
https://www.runoob.com/vue2/vue-tutorial.html promise promise是什么? 1.主要用于异步计算 2.可以将异步操作队列化,按照期望的顺序执 ...
- [转发]C++中new和malloc的区别
原文地址:https://blog.csdn.net/linux_ever/article/details/50533149 new与malloc的10点区别 1. 申请的内存所在位置 new操作符从 ...
- Dijkstra+Heap模板
普通Dijkstra: void DijkstraPath(int v0,int vis[],int dist[],int path[]) { int onePath[maxn]; int d; in ...