#!/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. SQL Server Profiler 常见问题总结

    1.跟踪指定数据库 SELECT DB_ID('数据名称') 原文:https://jingyan.baidu.com/article/647f0115be128a7f2048a87d.html 2. ...

  2. os.date

    代码中有一段如下: local date = os.date("*t", set) if date then           luci.sys.call("date ...

  3. [C]gcc编译器的一些常用语法

    简单的GCC语法: 如果你只有一个文件(或者只有几个文件),那么就可以不写Makefile文件(当然有Makefile更加方便),用gcc直接编译就行了.在这里我们只介绍几个我经常用的几个参数,第一是 ...

  4. C# 后台请求api

    /// <summary> /// 指定Post地址使用Get 方式获取全部字符串 /// </summary> /// <param name="url&qu ...

  5. CDH运维

    1.单个节点宕机后,想可能存在的问题: 时间同步是否正常运行 hbase对时间是否同步很敏感 2.zookeeper报警 ZooKeeper 服务 canary 因未知原因失败. 该警报是在重启CM的 ...

  6. css3 自定义滚动条样式

    ::-webkit-scrollbar :滚动条整体部分 ::-webkit-scrollbar-thumb :滚动条里面的小方块样式 ::-webkit-scrollbar-track 滚动条的轨道 ...

  7. c# 图片插入Excel

    引用COM:Microsoft Office 11.0 Object Library 引用类:    using System;    using System.Windows.Forms;    u ...

  8. Modbus库开发笔记之三:Modbus TCP Server开发

    在完成了前面的工作后,我们就可以实现有针对性的应用了,首先我们来实现Modbus TCP的服务器端应用.当然我们不是做具体的应用,而是对Modbus TCP的服务器端应用进行封装以供有需要时调用. 这 ...

  9. JS和Jquery获取和修改label的值的示例代码

    abel标签在JS和Jquery中使用不能像其他标签一样用value获取它的值,下面有个不错的示例,希望大家可以学习下 来源:  <  JS和Jquery获取和修改label的值的示例代码  & ...

  10. oracle数据库内存调整之增加内存

    注:本文来源:小颜Kevin   <oracle数据库内存调整之增加内存> 模拟操作系统内存从2G增加为8G后,调整数据库内存参数,示例中参数不作为实际生产环境参考,因为因需所取,调整参数 ...