#!/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. Nginx 开启目录下载

    平时应用中,我们大都用apache搭建下载页面.毕竟Apache搭建起来非常方便,yum安装,创建目录就可以了. 但有时还是需要用nginx配置下载页面.这里就是一个简单的配置nginx下载页面的过程 ...

  2. Python os.remove() 删除文件

    概述 os.remove() 方法用于删除指定路径的文件.如果指定的路径是一个目录,将抛出OSError. 在Unix, Windows中有效 语法 remove()方法语法格式如下: os.remo ...

  3. Mudo C++网络库第六章学习笔记

    muduo网络库简介 高级语言(Java, Python等)的Sockects库并没有对Sockects API提供更高层的封装, 直接用它编写程序很容易掉到陷阱中: 网络库的价值还在于能方便地处理并 ...

  4. k8s技能树

  5. $Django 前后端之 跨域问题(同源策略) vue项目(axios跨域请求数据)

    1 跨域问题(多个域之间的数据访问) #同源策略(ip port 协议全部相同) #本站的只能请求本站域名的数据 #CORS实现(跨域资源共享) #实现CORS通信的关键是服务器.只要服务器实现了CO ...

  6. 如何安装和配置RabbitMQ

    今天开始一个小小的练习,学习一下安装和配置RabbitMQ,为什么要学它,因为WCF可以完全兼容和使用RabbitMQ了.我们新的大数据系统需要使用消息队列,所以就开始研究一下,把它重新封装一下,更便 ...

  7. python学习第40天

    # 多表查询 # 索引的基础理论 + 数据准备

  8. Ex4_21 最短路径算法可以应用于货币交易领域..._第十二次作业

    (a)   建立一个有向图G(V,E),每个顶点表示一种货币,两个顶点之间的边权的大小ex[u][v]表示两种货币之间的汇率,若要找一个最有利的兑换序列,把货币s兑换成货币t,即在若干种兑换序列中选择 ...

  9. 【进阶1-2期】JavaScript深入之执行上下文栈和变量对象(转)

    这是我在公众号(高级前端进阶)看到的文章,现在做笔记 https://mp.weixin.qq.com/s/hZIpnkKqdQgQnK1BcrH6Nw 阅读笔记 JS是单线程的语言,执行顺序肯定是顺 ...

  10. 瑞联科技:Pwp3框架 调用存储过程返还数据集合 到前端界面展示

    一:代码结构: 1:Js 代码结构 2:Java 代码结构 二:前端界面展示效果 为了数据安全性:界面数据做了处理 三:全端代码展示 1:main.vop <html> <head& ...