这里就不一一诉说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的更多相关文章

  1. python_way ,自定义session

    python_way ,自定义session container = {} #可以是数据库,可以是缓存也可以是文件 class Session: def __init__(self, handler) ...

  2. 可灵活扩展的自定义Session状态存储驱动

    Session是互联网应用中非常重要的玩意儿,对于超过单台部署的站点集群,都会存在会话共享的需求.在web.config中,微软提供了sessionstate节点来定义不同的Session状态存储方式 ...

  3. Asp.net Mvc 自定义Session (二)

    在 Asp.net Mvc 自定义Session (一)中我们把数据缓存工具类写好了,今天在我们在这篇把 剩下的自定义Session写完 首先还请大家跟着我的思路一步步的来实现,既然我们要自定义Ses ...

  4. Asp.net Mvc 自定义Session (一),

    大家都知道用系统默认的session 会存在这样的问题 如果用户过多的话 session 会自动消亡,而且不能支持分布式和集群. 这系列博客主要讲解  怎样 解决用户过多的session自动消亡,和分 ...

  5. 自定义session扫描器

    为何要自定义session扫描器 由于服务器来管理session的销毁不怎么靠谱,因此很多网站都会自己定义一个session扫描器来管理session的创建和销毁. 实现思路 首先,创建一个sessi ...

  6. 监听器应用【统计网站人数、自定义session扫描器、踢人小案例】

    从第一篇已经讲解过了监听器的基本概念,以及Servlet各种的监听器.这篇博文主要讲解的是监听器的应用. 统计网站在线人数 分析 我们在网站中一般使用Session来标识某用户是否登陆了,如果登陆了, ...

  7. Tronado自定义Form组件

    Tronado自定义Form组件 一.获取类里面的静态属性以及动态属性的方法 方式一: # ===========方式一================ class Foo(object): user ...

  8. 简单的自定义Session

    有关Session.Cookie机制建议参考文章:CookieSession机制详解,写的很详细,不再赘述 本篇文章通过一个简单的案例揭秘Session机制以及和Cookie的区别和联系: 服务器端代 ...

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

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

随机推荐

  1. C# 单元测试(入门)

    注:本文示例环境 VS2017XUnit 2.2.0 单元测试框架xunit.runner.visualstudio 2.2.0 测试运行工具Moq 4.7.10 模拟框架 什么是单元测试? 确保软件 ...

  2. mxonline 总结

    课程相关 课程列表 课程的剪接 课程详情 课程章节 课程关联的授课机构,课程关联的授课教师 热门课程 相关课程推荐 课程留言 需要登录 若未登录,返回到登录页面 留言失败反馈信息 留言成功,异步刷新页 ...

  3. let'encript 解决证书问题

    今天服务器let'encript证书过期了,年纪大了老忘,不得不把别人的博客看一遍,就是因为我不想定时任务执行acme_tiny.py,还是写个文档记下,很久不写对外博客了,冒个泡. 1.创建普通域名 ...

  4. CentOS 7 安装配置 Gitlab

    centos:http://www.centos.org/download/ download:https://about.gitlab.com/downloads/ update:https://g ...

  5. Linux的Bash Shell详解

    一.Bash Shell概述 1.什么是bash         bash是Bourne Again Shell的简称,是从unix系统中的sh发展而来的,是用户和Linux内核交互的工具,用户通过b ...

  6. linux下的重命名

    mv oldname newname 显然,移动命令可以实现重命名. 而rename命令通常用于批量文件的重命名.

  7. 关于SAN和NAS的区别-转

    什么是SAN与NAS By  王文平 发表于 2006-7-10 18:03:53  NAS和SAN字面上相似,并且都是新型数据存储模式,但这二者是完全不同的,针对不同方向的技术. 什么是SAN(St ...

  8. Hibernate关联关系映射之一对多双向映射

    一对多映射有两种,一种是单向的,另一种的多向.我们一般是使用双向的,所以我就写写一对多的双向映射. 还是想昨天一样举个例子来说明:作者<===>作品,还是对数据进行增删改查. 我们一般是把 ...

  9. PHP缓存库phpFastCache

    phpFastCache是一个开源的PHP缓存库,只提供一个简单的PHP文件,可方便集成到已有项目,支持多种缓存方法,包括:apc, memcache, memcached, wincache, fi ...

  10. MVC应用程序JsonResult()的练习

    这次学习MVC应用程序,尝试使用jQuery的获取数据,并显示于视图上,关键技术还是javascript的一个子集Json.我们先去HomeController写一个方法JsonResult GetJ ...