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实现的更多相关文章

  1. 第二百六十九节,Tornado框架-Session登录判断

    Tornado框架-Session登录判断 Session需要结合cookie来实现 Session的理解 1.用户登录系统时,服务器端获取系统当前时间,进行nd5加密,得到加密后的密串 2.将密串作 ...

  2. Tornado 自定义session,与一致性哈希 ,基于redis 构建分布式 session框架

    Tornado 自定义session,与一致性哈希 ,基于redis 构建分布式 session import tornado.ioloop import tornado.web from myhas ...

  3. tornado自定义session

    这开始之前我们先了解以下什么是cookie和session 简单的说: cookie是保存在客户端的键值对 session是保存在服务端的键值对 session依赖与cookie 在Django中,可 ...

  4. 自定义Tornado的session组件

    session和cookie的关系 cookie:保存在客户端浏览器上的键值对 session_id = "eyJ1c2VyX2luZm8iOiJ" session:保存在服务器上 ...

  5. 关于tornado中session的总结

    #!/usr/bin/env python# _*_ coding:utf-8 _*_ import tornado.webimport tornado.ioloop container = {} # ...

  6. tornado 自定义session (二)

    有了上一步的基础,我们将session改造成一个模块,这样我们就可以通过配置,来使用不同方式(redis,数据库等)的session. 添加一个新目录:TornadoSession conf.py是配 ...

  7. tornado 自定义session (一)

    tornado 中没有session功能,需要我们自己实现. 目录: settings: settings = { 'template_path': 'templates', 'static': 's ...

  8. tornado session

    [转]tornado入门 - session cookie 和session 的区别: 1.cookie数据存放在客户的浏览器上,session数据放在服务器上. 2.cookie不是很安全,别人可以 ...

  9. Session for Tornado(Redis) - 代码分享

    Session for Tornado(Redis) - 代码分享   Session for Tornado(Redis) session id的生成借用了web.py. 使用了 redis 的 h ...

随机推荐

  1. GSVA的使用

    GSVA的简介 Gene Set Variation Analysis,被称为基因集变异分析,是一种非参数的无监督分析方法,主要用来评估芯片核转录组的基因集富集结果.主要是通过将基因在不同样品间的表达 ...

  2. PHP与Cookie

    不管什么语言写的cookie,本质上没区别. cookie 常用于识别用户.cookie 是服务器留在用户计算机中的小文件.每当相同的计算机通过浏览器请求页面时,它同时会发送 cookie.通过 PH ...

  3. PHP中文名加密

    <?php function encryptName($name) { $encrypt_name = ''; //判断是否包含中文字符 if(preg_match("/[\x{4e0 ...

  4. LeetCode 206. 反转链表(Reverse Linked List) 16

    206. 反转链表 206. Reverse Linked List 题目描述 反转一个单链表. 每日一算法2019/5/19Day 16LeetCode206. Reverse Linked Lis ...

  5. 微信自研生产级paxos类库PhxPaxos实现原理介绍

    转载自:   http://mp.weixin.qq.com/s?__biz=MzI4NDMyNTU2Mw==&mid=2247483695&idx=1&sn=91ea4229 ...

  6. CSS中的position和float

    对基础知识再度做个巩固和梳理. 一.position定位 (一):position的属性 1.absolute:生成绝对定位的元素,相对于最近一级定位不是static的父元素来进行定位: 2.rela ...

  7. 初始NLTK

    NLTK官网:链接 Natural Language Toolkit NLTK corpora and lexical resources such as WordNet, along with a ...

  8. WUSTOJ 1308: 采药(Java)动态规划-01背包

    题目链接:

  9. python 流程判断

    import getpass# print("hello word") ## name= 'pangxiao'# mix_name=name# print(mix_name,nam ...

  10. Student's Camp CodeForces - 708E (dp,前缀和优化)

    大意: $n$行$m$列砖, 白天左侧边界每块砖有$p$概率被摧毁, 晚上右侧边界有$p$概率被摧毁, 求最后上下边界连通的概率. 记${dp}_{i,l,r}$为遍历到第$t$行时, 第$t$行砖块 ...