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 ...
随机推荐
- 简单理解jQuery中$.getJSON、$.get、$.post、$.ajax用法
在WEB开发中异步请求方式普遍使用,ajax技术减少程序员的工作量,也提升用户交互体验.AJAX的四种异步请求方式都能实现基本需求,闲话不多说,直接切入正题. 1.$.getJSON $.getJSO ...
- iOS--各种bug详解
1.为什么传的参数都对,但是就是请求不下来数据. 答:检查下传的字符串中,是不是有多的空格. 例如: 错误:{"startIndex":"1","en ...
- 开发ASP.NET MVC 在线录音录像(音视频录制并上传)
最近有个在线招聘录音的开发需求,需要在招聘网站上让招聘者上传录音和视频. 找到两个不错的javascript开源,可以在除了IE以外的浏览器运行. https://github.com/mattdia ...
- Spring Boot 中使用 Jedis 及 Lettuce的对比
首先,同样的程序,采用不同方式的Redis连接方式. defautl : 默认,0配置 ,也就是走的是 lettuce 单通道方式. 端口:8081 jedis : 使用Jedis 连接池. ...
- idea 安装mybatis plugin (mybatis插件)
注意:可以用免费版本的,就是下面没有 被红框圈中的 Free Mybatis Plugin 安装上以后需要破解,先找到下面的文件 打开文件,设置其中的key 和 value : 这里面的key 和 v ...
- 二分查找的实现(java版本)
一.二分法查找的定义 依次将所查找数据与中心数据对比,根据大小调整数据边界二.二分查找的条件 数组必须排序三.二分查找的原理 四.二分法查找的代码 /* * 从数组当中找到4所在的索引: * {2,4 ...
- socket心跳超时检测,快速处理新思路(适用于超大量TCP连接情况下)
假设一种情景:TCP服务器有1万个客户端连接,如果客户端5秒钟不发数据,则要断开.服务端如何检测客户端是否超时?这看起来是一个非常简单的问题,其实不然! 最简单的处理方法是:启动一个线程,每隔一段时间 ...
- div或其他html控件的overflow使用滚动条
在编写html代码时, 有时候不想把控件撑大,滚动条就是个不错的选择 如下代码 <div style="height:auto !important;max-height:58px;o ...
- Linux 一次杀死多进程
.- | 说明: “grep firefox”的输出结果是,所有含有关键字“firefox”的进程. “grep -v grep”是在列出的进程中去除含有关键字“grep”的进程. “-”是截取输入行 ...
- MySQL进程-状态等参数详解
查看连接 mysql -uroot -p123456 -e "show processlist;" 查看正在执行的sql语句 mysql -uroot -p123456 -e &q ...