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 ...
随机推荐
- flask_json数据入库Mongo
首先我们先导入python内置的json库,用来将接送数据转换为python对象 import json #导入自定义的数据公共库 from db_tool import db #载入库之前先清空数据 ...
- ajex 相关参数
1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为String类型的参数,请求方式(post或get)默认为get.注意其他http请求方法,例如 ...
- 安装Centos7 随手记
1.老笔记本安装Centos7 配置:酷睿I3 内存8G 2.原有系统Win7 将原来的硬盘空间,调整出60G 给Centos7 用. 3.安装Centos7 图形介面的,和windows安装过程类 ...
- nginx在centos 7中源码编译安装【添加grpc的支持】
安装依赖软件 1.安装编译工具gcc gcc是一个开源编译器集合,用于处理各种各样的语言:C.C++.Java.Ada等,在linux世界中是最通用的编译器,支持大量处理器:x86.AMD64.Pow ...
- 设置JVM参数的几种方式解决java.lang.OutOfMemoryError:Java heap space
一.首先给出查询当前JVM内存的代码: 下面是查询当前JVM 内存大小的代码,可以测试设置后JVM 的内存是否会变化.增加JVM 内存的配置项后,无需重新启动eclipse .具体的代码如下: pub ...
- 用Elasticsearch做大规模数据的多字段、多类型索引检索
本文同时发布在我的个人博客 之前尝试了用mysql做大规模数据的检索优化,可以看到单字段检索的情况下,是可以通过各种手段做到各种类型索引快速检索的,那是一种相对简单的场景. 但是实际应用往往会复杂一些 ...
- 深度理解C# 的执行原理
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由鹅厂优文发表于云+社区专栏 从编译原理说起 虚拟机是什么 C# 是什么,IL 又是什么 .Net Framework vs Mono ...
- win 7 64 mysql 5.6.4 安装
windows 7 64位下配置mysql64位免安装版1.官方网站下载mysql-5.6.10-winx64.zip2.解压到E:\MYSQL(路径自己指定)3.在E:\MYSQL下新建my.ini ...
- hibernate辅助类含分页
package com.cy.utils; import java.io.Serializable; import java.util.Iterator; import java.util.List; ...
- 技术笔记2 jetty jboss
jetty热部署: jetty启动加载文件webdefault.xml .文件里: <init-param> <param-name>useFileMappedBuffer&l ...