#!/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. Markdown中Latex 数学公式基本语法

    原文地址:http://blog.csdn.net/u014630987/article/details/70156489 Markdown中Latex 数学公式基本语法 公式排版 分为两种排版: - ...

  2. ffmpeg 增加视频流媒体质量评估滤镜 (Video Multimethod Assessment Fusion, VMAF)

    URL: https://github.com/Netflix/vmaf libvmaf Obtain the VMAF (Video Multi-Method Assessment Fusion) ...

  3. 8-Images

    HTML Image Tags Tag Description <img> Defines an image <map> Defines an image-map <ar ...

  4. [C]va_list可变长参数的使用

    一.概述 运用标准C的头文件stdarg.h提供的宏可以实现函数的自定义传参个数: 二.语法 1.va_list是一个可变长参数类型,在使用可变长参数的函数中可以定义1个或多个va_list类型参数, ...

  5. Django 配置(一)开启服务

    注:这里使用的是命令行创建,当然也可以用 pycharm 自带的 django 项目创建更加简便. 安装django pip install django 创建项目 django-admin star ...

  6. Spring 5 WebFlux

    作者: 一字马胡 转载标志 [2017-11-26] 更新日志 日期 更新内容 备注 2017-11-26 新建文章 Spring 5 WebFlux demo Reactor Spring 5的一大 ...

  7. jq获取页面url后边带的参数

    //获取url后边的参数 $.getUrlParam = function (name) {                  var reg = new RegExp("(^|&) ...

  8. 纯webpack打包项目

    webpack 3 零基础入门教程 http://webpackbook.rails365.net/466996(文本) https://www.rails365.net/movies/webpack ...

  9. 解决Navicat连接MySQL总是报错1251的方法

    今天下了个 MySQL8.0,发现Navicat连接不上,总是报错1251: 原因是MySQL8.0版本的加密方式和MySQL5.0的不一样,连接会报错. 试了很多种方法,终于找到一种可以实现的: 更 ...

  10. Confluence 6 恢复一个站点有关使用站点导出为备份的说明

    推荐使用生产备份策略.我们推荐你针对你的生产环境中使用的 Confluence 参考 Production Backup Strategy 页面中的内容进行备份和恢复(这个需要你备份你的数据库和 ho ...