#!/usr/bin/env python
# _*_ coding:utf-8 _*_ import tornado.web
import tornado.ioloop container = {} # container是一个储存在服务端包含客户端相关信息的字典,以键值对的形式存在 class Session:
def __init__(self, handler):
self.handler = handler
# Session(self),self为Indexhandler实例化之后的对象
self.random_str = None def __genarate_random_str(self):
# 生成随机字符串,由于生成随机字符串的代码都是一样的,所以可以抽象出来单独作为一个函数
# 需要生成随机字符串的时候调用这个函数就返回一个经过加密的随机字符串
import hashlib
import time
obj = hashlib.md5()
obj.update(bytes(str(time.time()), encoding='utf-8'))
random_str = obj.hexdigest()
return random_str def __setitem__(self, key, value):
# 当类的对象 obj["random_str"]="key-value的值" 自动执行这个函数
# 总的来说,服务端先检测客户端有没有随机字符串,这里随机字符串是cookie的值
# 而随机字符串的value对应的是session的key
# 如果客户端没有随机字符串,则生成一个新的随机字符串
# 如果客户端有随机字符串,
# 检查该随机字符串服务端的session有没有,有先不做操作
# 如果服务端没有这个随机字符串,则执行__genarate_random_str()生成新的随机字符串
# 并把该随机字符串作为session的key值 # 当然前提条件是你已经通过身份验证才会有以上的操作 if not self.random_str:
# 首先客户端发请求过来并要设置session里面的key-value值的时候触发__setitem__
# 一开始self.random_str为None,
# 服务端先检测客户端有没有名为'__session__'的键值对(cookie) random_str = self.handler.get_cookie('__session__')
# 如果此时random_str为None,即客户端没有名为'__session__'的cookie
# 执行__genarate_random_str()生成随机字符串
# 并把该随机字符串作为session的key值
if not random_str:
random_str = self.__genarate_random_str()
container[random_str] = {}
# 然后此处按理来说应该为客户端设置key为'__session__',value为随机字符串的cookie
else:
# 如果此时客户端有名为'__session__'的cookie,
# 那么我们就要检测这个随机字符串是否存在于session里面
if random_str in container.keys():
pass
else:
# 如果不存在,就重新创造一个新的字符串并加入到session里
random_str = self.__genarate_random_str()
container[random_str] = {}
self.random_str = random_str container[self.random_str][key] = value
self.handler.set_cookie("__session__", self.random_str) def __getitem__(self, key):
# 当客户端请求manage页面,需要通过session验证
# 如果服务端拿到类随机字符串,则服务端把该字符串所对应的相关信息发送给浏览器端
random_str = self.handler.get_cookie("__session__") if not random_str:
return None
user_info_dict = container.get(random_str, None)
if not user_info_dict:
return None
value = user_info_dict.get(key, None)
return value class BaseHandler(tornado.web.RequestHandler):
def initialize(self):
self.session = Session(self) # 只要实例初始化都会执行这个函数
# self.session为session这个类的对象,通过self.session可以访问session这个类的属性和方法 class IndexHandler(BaseHandler):
def get(self):
if self.get_argument("u", None) in ["alex", "eric"]:
# 判断用户密码是否正确,只有用户密码正确了才能够设置session
self.session["is_login"] = True
# 自动触发__setitem__,在__setitem__里面直接完成随机字符串的检验,
# 生成,cookie的生成,session的设置
self.session["name"] = self.get_argument("u", None)
print(container)
self.write("cookie设置成功了")
else:
self.write("请登录") class ManaggerHandler(BaseHandler):
def get(self, *args, **kwargs):
print(container)
# print(self.get_cookie("__session__"))
val = self.session["is_login"]
# 自动触发__getitem__
if val:
self.write(self.session["name"] + "登录成功")
else:
self.write("登录失败") # 图片验证码 class CheckCodeHandler(BaseHandler):
def get(self, *args, **kwargs):
# 生成 图片并且返回
import io
import check_code
mstream = io.BytesIO()
img, code = check_code.create_validate_code() # 将图片对象写入mstream,
img.save(mstream, "GIF")
# 为每个用户保存期验证码
self.session["CheckCode"] = code self.write(mstream.getvalue()) class LoginHandler(BaseHandler):
def get(self, *args, **kwargs):
self.render('login.html', status="") def post(self, *args, **kwargs):
user = self.get_argument('user', None)
pwd = self.get_argument('pwd', None)
code = self.get_argument('code', None) check_code = self.session["CheckCode"]
if code.upper() == check_code.upper():
self.write('验证码正确')
else:
# self.redirect('/login')
self.render('login.html', status='验证码错误') # csrf class CsrfHandler(BaseHandler):
def get(self, *args, **kwargs):
self.render('csrf.html') def post(self, *args, **kwargs):
self.write('csrf.post') settings = {
"template_path": "views",
"static_path": "Statics",
"static_url_prefix": "/Statics/",
"cookie_secret": "abcdef",
'xsrf_cookies': True } application = tornado.web.Application([
(r"/index", IndexHandler),
(r"/manager", ManaggerHandler),
(r"/login", LoginHandler),
(r"/check_code", CheckCodeHandler),
(r"/csrf", CsrfHandler), ], **settings) if __name__ == '__main__':
application.listen(9000)
tornado.ioloop.IOLoop.instance().start()

关于tornado中session的总结的更多相关文章

  1. tornado自定义session

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

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

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

  3. tornado 自定义session (一)

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

  4. ASP.NET中Session的sessionState 4种mode模式

    1. sessionState的4种mode模式 在ASP.NET中Session的sessionState的4中mode模式:Off.InProc.StateServer及SqlServer. 2. ...

  5. Spring MVC中Session的正确用法<转>

    Spring MVC是个非常优秀的框架,其优秀之处继承自Spring本身依赖注入(Dependency Injection)的强大的模块化和可配置性,其设计处处透露着易用性.可复用性与易集成性.优良的 ...

  6. 【转】Spring MVC中Session的正确用法之我见

    Spring MVC是个非常优秀的框架,其优秀之处继承自Spring本身依赖注入(Dependency Injection)的强大的模块化和可配置性,其设计处处透露着易用性.可复用性与易集成性.优良的 ...

  7. 第三方支付过程中session失效问题

    第三方支付过程中session失效问题 时间 2015-05-13 12:36:23  IT社区推荐资讯 原文  http://itindex.net/detail/53436-session-问题 ...

  8. 跟我一起学WCF(8)——WCF中Session、实例管理详解

    一.引言 由前面几篇博文我们知道,WCF是微软基于SOA建立的一套在分布式环境中各个相对独立的应用进行交流(Communication)的框架,它实现了最新的基于WS-*规范.按照SOA的原则,相对独 ...

  9. Hibernate中Session的get和load

    hibernate中Session接口提供的get()和load()方法都是用来获取一个实体对象,在使用方式和查询性能上有一些区别.测试版本:hibernate 4.2.0. get Session接 ...

随机推荐

  1. C++、VC++、MFC网页自动注册、登陆、发帖、留言,QQ注册、QQ申请器源码、注册邮箱源码、自动发帖源码

    C++.VC++.MFC网页自动注册.登陆.发帖.留言,QQ注册.QQ申请器源码.注册邮箱源码.自动发帖源码   参考资料: 自动登录yahoo邮箱http://blog.csdn.net/suisu ...

  2. TCP与UDP区别小结

    TCP(Transmission Control Protocol):传输控制协议 UDP(User Datagram Protocol):用户数据报协议       主要从连接性(Connectiv ...

  3. Linux下的进程结构

    Linux系统是一个多进程的系统,它的进程之间具有并行性.互不干扰等特点.也就是说,每个进程都是一个独立的运行单位,拥有各自的权利和责任.其中,各个进程都运行在独立的虚拟地址空间.因此,即使一个进程发 ...

  4. 编译和运行dubbo-admin管理平台

      下载   Github上下载最新的dubbo源码包并解压     修改ZooKeeper相关的配置   打开dubbo-admin/src/main/webapp/WEB-INF下的dubbo.p ...

  5. 解决定位工具报错Error while parsing UI hierarchy XML file: Invalid ui automator hierarchy file.

    在微信自动化测试中,偶尔会出现某个页面一直无法读取到页面元素的情况,原因是页面未加载完成 解决方式:1.重启APP 2.建议上下滑动当前页面,如朋友圈,会出现滑动到某个地方,出现可以读取到的情况 参考 ...

  6. js用replaceAll全部替换的方法

    1 前言 js中字符串整体替换,只有自带的replace,并没有replaceAll,如果我们需要把字符串中的字符统一替换,可以用正则表达式,由于经常使用就在String直接加个原生方法,方便调用. ...

  7. 分布式系统的一致性协议之 2PC 和 3PC

    在分布式系统领域,有一个理论,对于分布式系统的设计影响非常大,那就是 CAP 理论,即对于一个分布式系统而言,它是无法同时满足 Consistency(强一致性).Availability(可用性) ...

  8. centos6.5 有趣但是没有用的linux命令

    小火车 get http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm rpm -ivh epel-rele ...

  9. (*(volatile unsigned long *)详解

    (*(volatile unsigned long *) 对于不同的计算机体系结构,设备可能是端口映射,也可能是内存映射的.如果系统结构支持独立的IO地址空间,并且是端口映射,就必须使用汇编语言完成实 ...

  10. 金9银10,分享几个重要的Android面试题

    说一下java多态的理解,以及接继承,和接口的理解 于哥在这里只讲多态,其他自己上网体会 对于多态的定义不同类的对象对统一函数做出不同对的响应或者动作.作用主要是消除类之间的耦合性,灵活性比较强,利于 ...