关于tornado中session的总结
#!/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的总结的更多相关文章
- tornado自定义session
这开始之前我们先了解以下什么是cookie和session 简单的说: cookie是保存在客户端的键值对 session是保存在服务端的键值对 session依赖与cookie 在Django中,可 ...
- 第二百六十九节,Tornado框架-Session登录判断
Tornado框架-Session登录判断 Session需要结合cookie来实现 Session的理解 1.用户登录系统时,服务器端获取系统当前时间,进行nd5加密,得到加密后的密串 2.将密串作 ...
- tornado 自定义session (一)
tornado 中没有session功能,需要我们自己实现. 目录: settings: settings = { 'template_path': 'templates', 'static': 's ...
- ASP.NET中Session的sessionState 4种mode模式
1. sessionState的4种mode模式 在ASP.NET中Session的sessionState的4中mode模式:Off.InProc.StateServer及SqlServer. 2. ...
- Spring MVC中Session的正确用法<转>
Spring MVC是个非常优秀的框架,其优秀之处继承自Spring本身依赖注入(Dependency Injection)的强大的模块化和可配置性,其设计处处透露着易用性.可复用性与易集成性.优良的 ...
- 【转】Spring MVC中Session的正确用法之我见
Spring MVC是个非常优秀的框架,其优秀之处继承自Spring本身依赖注入(Dependency Injection)的强大的模块化和可配置性,其设计处处透露着易用性.可复用性与易集成性.优良的 ...
- 第三方支付过程中session失效问题
第三方支付过程中session失效问题 时间 2015-05-13 12:36:23 IT社区推荐资讯 原文 http://itindex.net/detail/53436-session-问题 ...
- 跟我一起学WCF(8)——WCF中Session、实例管理详解
一.引言 由前面几篇博文我们知道,WCF是微软基于SOA建立的一套在分布式环境中各个相对独立的应用进行交流(Communication)的框架,它实现了最新的基于WS-*规范.按照SOA的原则,相对独 ...
- Hibernate中Session的get和load
hibernate中Session接口提供的get()和load()方法都是用来获取一个实体对象,在使用方式和查询性能上有一些区别.测试版本:hibernate 4.2.0. get Session接 ...
随机推荐
- Random() 插入数据重复的问题
今天在写一个小测试用例时,想在数据库插入一些数据.造数据时用到了Random函数,之前没有注意到这个问题,看到“Random生成随机数重复的问题”才注意到自己插入的数据有重复. ; i < ; ...
- C++ 类中特殊的成员变量(常变量、引用、静态)的初始化方法
有些成员变量的数据类型比较特别,它们的初始化方式也和普通数据类型的成员变量有所不同.这些特殊的类型的成员变量包括: a.引用 b.常量 c.静态 d.静态常量(整型) e.静态常量(非整型) 常量和引 ...
- MYSQL添加远程用户或允许远程访问
1.用root用户登陆 格式:grant 权限 on 数据库教程名.表名 to 用户@登录主机 identified by "用户密码"; @ 后面是访问M ...
- Linux内核初探
内存管理之内存寻址 内存管理是迄今为止Unix内核中最复杂的活动 虚拟内存: 所有新近的Unix系统都提供一种有用的抽象, 叫作虚拟内存(virtual memory): 虚拟内存可以理解为一种逻辑层 ...
- <转载>bellman-ford算法
转载来源:https://www.cnblogs.com/tanky_woo/archive/2011/01/17/1937728.html 相关文章: 1.Dijkstra算法: http://ww ...
- ORACLE的数据类型的长度合集
-- ORACLE的数据类型常用的数据库字段类型如下:字段类型 中文说明 限制条件 其它说明CHAR 固定长度字符串 最大长度2000 bytesVARCHAR2 可变长度的字符串 最大长度4000 ...
- Confluence 6 PostgreSQL 问题解决
如果 Confluence 提示没有 class 文件,你可能将你的 JDBC 驱动放置到了错误的文件夹. 如果你不能从你从 Confluence 中连接到 PostgreSQL ,并且这 2 个服务 ...
- requireJs require.config公共配置
//场景:让require.config配置文件成一个公共文件,每个页面引用这个公共配置 //方式一样例: require.config({ baseUrl: (function () { var p ...
- redis-4.0.8 配置文件解读
# Redis configuration file example.## Note that in order to read the configuration file, Redis must ...
- laravel 兜底路由
在 Laravel 5.6 中,引入了兜底路由功能.所谓兜底路由,就是当路由文件中定义的所有路由都无法匹配用户请求的 URL 时,用来处理用户请求的路由,在此之前,Laravel 都会通过异常处理器为 ...