Tronado自定义Session
这里就不一一诉说Session和Cookie直接的关系了,下面以一张图来概括:

下面是一个简单的Tornaod自定义Session的例子,看完后你可能会明白为什么我们在Django里可以直接使用request.session来获取或者设置键值对的原因,在这个例子中包含了许多调用类里面的方法,例如__contains__ , __getitem__ , __setitem__ , __delitem__等:
版本1:
import tornado.ioloop
import tornado.web
import time,hashlib
from controllers.account import LoginHandler
from controllers.home import HomeHandler container = {}
# container = { '随机字符串或者cookie':{'uuuu':'root','k1':'v1'}, } class Session(object):
def __init__(self,handler):
self.handler = handler
self.random_str = None # 随机字符串,也有可能是cookie
self.client_random_str = self.handler.get_cookie('session_id')
print('哪里来的str',self.client_random_str)
if not self.client_random_str:
"""新用户,没有cookie的"""
# . 生成随机字符串当作session中的key,保存在大字典container中,用户每次访问都到里面找是否有该值
self.random_str = self.create_random_str()
container[self.random_str] = {} # 保存在大字典
else:
if self.client_random_str in container:
"""老用户,在container大字典里面了"""
self.random_str = self.client_random_str
print('老用户',container)
else:
"""非法用户,伪造的cookie"""
self.random_str = self.create_random_str()
container[self.random_str] = {} # . 生成cookie,必须调用LoginHandler才能使用set_cookie()
timeOut = time.time()
self.handler.set_cookie('session_id',self.random_str,expires=timeOut+) # . 写入缓存或数据库 ==> 后面用户自己调用session['uuuu'] = 'root' def create_random_str(self):
now = str(time.time())
m = hashlib.md5()
m.update(bytes(now,encoding='utf-8'))
return m.hexdigest() def __setitem__(self, key, value):
# print(key,value) # key 就是用户自己设置session['uuuu']='root'中的uuuu,value就是root
container[self.random_str][key] = value
# print('setitem',container) def __getitem__(self, item):
# print(item) # uuuu
# print('getitem',container)
return container[self.random_str].get(item) def __delitem__(self, key):
pass
def open(self):
pass
def cloes(self):
pass class Foo(object):
def initialize(self):
# print(self) # <__main__.LoginHandler object at 0x00000000038702E8>
self.session = Session(self)
super(Foo, self).initialize() # 执行RequestHandler中的initialize class HomeHandler(Foo,tornado.web.RequestHandler):
def get(self):
print('session',self.session)
user = self.session['uuuu'] # 调用Session类中的__getitem__方法, 获取value
print('user',user)
if not user:
self.write('不是合法登录')
else:
self.write(user) class LoginHandler(Foo,tornado.web.RequestHandler):
def get(self): # self.session['uuuu'] # 调用Session类中的__getitem__方法, 获取value
# del self.session['uuuu'] # 调用Session类中的__delitem__方法, 删除
self.session['uuuu'] = "root" # 调用Session类中的__setitem__方法,在session里面设置了uuuu
self.write("Hello, world")
print(container)
self.redirect('/home') application = tornado.web.Application([
# (r"/index", MainHandler),
(r"/login", LoginHandler),
(r"/home", HomeHandler),
]) if __name__ == "__main__":
application.listen()
tornado.ioloop.IOLoop.instance().start()
Version 1
版本2,可根据需要将session写入缓存或者数据库,下面以写入Cache为例:
import tornado.ioloop
import tornado.web
import time,hashlib
from controllers.account import LoginHandler
from controllers.home import HomeHandler container = {}
# container = { '随机字符串或者cookie':{'uuuu':'root','k1':'v1'}, } class Cache(object):
"""将session保存在内存"""
def __init__(self):
# self.container = {}
pass
def __contains__(self, item):
print('__contains__:',item)
return True
def initial(self,random_str):
container[random_str] = {}
def get(self,random_str,key):
return container[random_str].get(key) def set(self,random_str,key,value):
container[random_str]={}
container[random_str][key] = value
def delete(self,random_str,key):
del container[random_str][key]
def open(self):
pass
def close(self):
pass
def clear(self,random_str):
del container[random_str] class Memcache(object):
def __init__(self):
pass
def get(self,key):
pass
def set(self,key,value):
pass
def delete(self,key):
pass
def open(self):
pass
def close(self):
pass P = Cache # . 可以是Memcache,根据用户自己选择要写入缓存还是数据库... class Session(object):
def __init__(self,handler):
self.handler = handler
self.random_str = None # 随机字符串,也有可能是cookie
self.ppp = P()
# 去用户请求信息中获取session_id,如果没有,新用户
self.client_random_str = self.handler.get_cookie('session_id')
if not self.client_random_str:
"新用户"
self.random_str = self.create_random_str()
container[self.random_str] = {}
else:
if self.client_random_str in self.ppp:
"老用户"
self.random_str = self.client_random_str
else:
"非法用户"
self.random_str = self.create_random_str()
self.ppp.initial(self.random_str) # . 生成cookie,必须调用LoginHandler才能使用set_cookie()
timeOut = time.time()
self.handler.set_cookie('session_id',self.random_str,expires=timeOut+) # . 写入缓存或数据库 Cahce、Memcache ==> 后面用户自己调用session['uuuu'] = 'root' def create_random_str(self):
now = str(time.time())
m = hashlib.md5()
m.update(bytes(now,encoding='utf-8'))
return m.hexdigest() def __setitem__(self, key, value):
# print(key,value) # key 就是用户自己设置session['uuuu']='root'中的uuuu,value就是root
self.ppp.set(self.random_str, key, value)
print('',container) def __getitem__(self, item):
# print(item) # uuuu
# print('getitem',container)
print('',container)
return self.ppp.get(self.random_str,item) def __delitem__(self, key):
self.ppp.delete(self.random_str,key)
def open(self):
pass
def cloes(self):
pass class Foo(object):
def initialize(self):
# print(self) # <__main__.LoginHandler object at 0x00000000038702E8>
self.session = Session(self) # 传入Session的self就是调用者,谁调用Session谁就是self
super(Foo, self).initialize() # 执行RequestHandler中的initialize class HomeHandler(Foo,tornado.web.RequestHandler):
def get(self):
user = self.session['uuuu'] # 调用Session类中的__getitem__方法, 获取value
print('user',user)
if not user:
self.write('不是合法登录')
else:
self.write(user)
print('哈哈哈测试成功,删除啦')
del self.session['uuuu']
print(container) class LoginHandler(Foo,tornado.web.RequestHandler):
def get(self):
# self.session['uuuu'] # 调用Session类中的__getitem__方法, 获取value
# del self.session['uuuu'] # 调用Session类中的__delitem__方法, 删除
self.session['uuuu'] = "root" # 调用Session类中的__setitem__方法,在session里面设置了uuuu
self.write("Hello, world")
# print(container)
self.redirect('/home') application = tornado.web.Application([
# (r"/index", MainHandler),
(r"/login", LoginHandler),
(r"/home", HomeHandler),
]) if __name__ == "__main__":
application.listen()
tornado.ioloop.IOLoop.instance().start()
Version 2
Tronado自定义Session的更多相关文章
- python_way ,自定义session
python_way ,自定义session container = {} #可以是数据库,可以是缓存也可以是文件 class Session: def __init__(self, handler) ...
- 可灵活扩展的自定义Session状态存储驱动
Session是互联网应用中非常重要的玩意儿,对于超过单台部署的站点集群,都会存在会话共享的需求.在web.config中,微软提供了sessionstate节点来定义不同的Session状态存储方式 ...
- Asp.net Mvc 自定义Session (二)
在 Asp.net Mvc 自定义Session (一)中我们把数据缓存工具类写好了,今天在我们在这篇把 剩下的自定义Session写完 首先还请大家跟着我的思路一步步的来实现,既然我们要自定义Ses ...
- Asp.net Mvc 自定义Session (一),
大家都知道用系统默认的session 会存在这样的问题 如果用户过多的话 session 会自动消亡,而且不能支持分布式和集群. 这系列博客主要讲解 怎样 解决用户过多的session自动消亡,和分 ...
- 自定义session扫描器
为何要自定义session扫描器 由于服务器来管理session的销毁不怎么靠谱,因此很多网站都会自己定义一个session扫描器来管理session的创建和销毁. 实现思路 首先,创建一个sessi ...
- 监听器应用【统计网站人数、自定义session扫描器、踢人小案例】
从第一篇已经讲解过了监听器的基本概念,以及Servlet各种的监听器.这篇博文主要讲解的是监听器的应用. 统计网站在线人数 分析 我们在网站中一般使用Session来标识某用户是否登陆了,如果登陆了, ...
- Tronado自定义Form组件
Tronado自定义Form组件 一.获取类里面的静态属性以及动态属性的方法 方式一: # ===========方式一================ class Foo(object): user ...
- 简单的自定义Session
有关Session.Cookie机制建议参考文章:CookieSession机制详解,写的很详细,不再赘述 本篇文章通过一个简单的案例揭秘Session机制以及和Cookie的区别和联系: 服务器端代 ...
- Tornado 自定义session,与一致性哈希 ,基于redis 构建分布式 session框架
Tornado 自定义session,与一致性哈希 ,基于redis 构建分布式 session import tornado.ioloop import tornado.web from myhas ...
随机推荐
- javaScript中BOM
BOM是browser object model的缩写,简称浏览器对象模型 主要处理浏览器窗口(window)和框架(iframe),简述了与浏览器进行交互的方法和接口, 可以对浏览器窗口进行访问和操 ...
- linux服务器的相关信息查看(端口占用,cpu、内存占用,防火墙,系统信息,vim编辑器使用等)
一.端口占用情况 https://www.cnblogs.com/CEO-H/p/7794306.html (1)查看所有端口.进程的使用情况:netstat -tunlp (2)查看某一端口的使 ...
- zookeeper 备忘
cd /bin $ ./zkCli.sh ls /a 查看 ls /a true 查看并watch create –e /a 临时节点 create –s /a 顺序节点 create –e –s / ...
- Vim实用技巧系列 - 利用百度云和git实现vim配置多机共享
Vim是一个强大的文本编辑器.良好的配置更能便利对Vim的使用.有时候,我们会在几台不同的电脑上使用Vim. 例如,我们可能在自己的电脑和公司的电脑上都安装了Vim. 有时候,我们需要实现,如果我们配 ...
- django views视图函数返回值 return redirect httpresponse总结
django views视图函数返回值 return redirect render httpresponse总结
- web3调用call()方法获取不到返回值
一.web3的call()获取不到返回值问题和解决方法 在彩票小合约中,遇到一个问题:合约中 有两个方法 第一个返回一个账户地址,没有使用到当前方法调用者信息: 第二个使用到了当前方法调用者信息 在w ...
- python获取动态网站上面的动态加载的数据(初级)
我们在处理一些网站数据的时候,有时候我们需要的数据很多都是动态加载的,而不都是静态的,以下以一个实例来介绍简单的获取动态数据,首先申明本人小白,还在学习python中,这个方法还是比较笨拙的,但是对于 ...
- java+hibernate+mysql
实体类News package org.mythsky.hibernatedemo; import javax.persistence.*; @Entity @Table(name="new ...
- 02-03:springboot 整合listener
1.通过注解扫描完成Listener组件的注册 1.1 编写listener /** * Springboot 整合listener */ import javax.servlet.ServletCo ...
- js便签笔记(9)——解读jquery源码时记录的一些知识点
近来一直利用业余时间在看jquery2.1.1源码,大约看了两千行了.平时看的时候,做了一些笔记,贴出来分享. 1. Array.prototype.slice.call 可以将伪数组转化为真正的数组 ...