python---定义一个session类(无错)
- import tornado.web
- #放在内存 redis 文件 数据库
- container={}
- #定义一个session类
- class Session:
- def __init__(self,handler):
- self.handler=handler
- self.random_str=None
- pass
- def __genarate_random_str(self):
- import hashlib
- import time
- obj = hashlib.md5()
- obj.update(bytes(str(time.time()), encoding="utf8"))#传入byte类型
- random_str = obj.hexdigest()#返回字符串
- return random_str
- def set_value(self,key,value):
- #在container中加入随机字符串
- #加入自定义数据
- #在客户端中写入随机字符串
- if not self.random_str:
- if self.handler.get_cookie('py_session'):
- random_str=self.handler.get_cookie('py_session')
- if not container.get(random_str,None):
- random_str = self.__genarate_random_str()
- else:
- random_str=self.__genarate_random_str()
- self.random_str=random_str
- if not container.get(self.random_str,None):
- container[self.random_str]={}
- container[self.random_str][key]=value
- #加入客户端
- self.handler.set_cookie('py_session',self.random_str)
- def get_value(self,key):
- #先去获取客户端的随机字符串
- #从container中获取自定义数据
- #random_str=self.handler.get_cookie('py_session',None)
- random_str=self.random_str
- dict_info=container.get(random_str,None)
- if not dict_info:
- return None
- return dict_info[key]
- class IndexHandler(tornado.web.RequestHandler):
- def get(self):
- if self.get_argument('u',None) in ['asd','zxc']:
- s = Session(self)
- #在这里有个bug,当程序两次设置值时,逻辑相同,但是由于只发送了一次请求,获取了第一次的py_session
- #在相同逻辑代码处理下random_str=self.handler.get_cookie('py_session')
- #每次都是不正确的,都需要重新创建一个标识符
- #但是后面的刷新过程中由于修改了客户区的py_session,所以可以正常进行操作,但是第一次产生的py_session的依旧存在服务端
- s.set_value('is_login',True)
- s.set_value('name',self.get_argument('u'))
- #self.get_secure_cookie()
- #The decoded cookie value is returned as a byte string (unlike
- #`get_cookie`).
- else:
- self.write("请登录")
- class ManagerHandler(tornado.web.RequestHandler):
- def get(self, *args, **kwargs):
- s=Session(self)
- val = s.get_value('is_login')
- if val:
- self.write("登录成功"+s.get_value('name'))
- else:
- self.redirect("/index")
- settings ={
- 'template_path':'views',
- 'static_path':'statics',
- 'cookie_secret':'dafawafawfaw',
- }
- application = tornado.web.Application([
- (r"/index",IndexHandler),
- (r"/manager",ManagerHandler),
- ],**settings)
- if __name__=="__main__":
- application.listen(8080)
- tornado.ioloop.IOLoop.instance().start()
python---定义一个session类(无错)的更多相关文章
- python---定义一个session类
首先:注意cookie中的get_cookie是返回字符串,而get_secure_cookie返回的是字节类型 #self.get_secure_cookie() #The decoded cook ...
- python定义接口继承类
zxq547 python定义接口继承类invalid syntax解决办法 1 2 3 4 5 6 7 class s_all(metaclass=abc.ABCMeta): #python ...
- 实验四 (1):定义一个形状类(Shape)方法:计算周长,计算面积
(1)定义一个形状类(Shape)方法:计算周长,计算面积子类:矩形类(Rectangle) :额外的方法:differ() 计算长宽差圆形类(Circle)三角形类(Triangle)正方形类(Sq ...
- 定义一个Rectangle类,该类提供getLength和getWidth方法。
import java.util.Comparator; /** * 定义一个Rectangle类,该类提供getLength和getWidth方法.利用图1-18中的findMax例程编写 * 一种 ...
- java定义一个Circle类,包含一个double型的radius属性代表圆的半径,一个findArea()方法返回圆的面积
需求如下:(1)定义一个Circle类,包含一个double型的radius属性代表圆的半径,一个findArea()方法返回圆的面积. (2)定义一个类PassObject,在类中定义一个方法pri ...
- 定义一个Person类,其中包括:1.定义属性:姓名、年龄、民族作为成员变量。定义静态成员变量:人数2.定义构造方法:对成员变量进行初始化。3.定义多个方法:分别显示相应的属性值,例如getName(){System.out.print("名称="+name+";"); }4.定义一个方法“成长”:实现年龄的增加,每执行一次年龄增加1
题目显示不全,完整题目描述: (1)定义一个Person类,其中包括:1.定义属性:姓名:年龄:民族作为成员变量.定义静态成员变量:人数2.定义构造方法:对成员变量进行初始化.3.定义多个方法:分别显 ...
- Java初学者作业——定义一个计算器类, 实现计算器类中加、 减、 乘、 除的运算方法, 每个方法能够接收2个参数。
返回本章节 返回作业目录 需求说明: 定义一个计算器类, 实现计算器类中加. 减. 乘. 除的运算方法, 每个方法能够接收2个参数. 实现思路: 定义计算器类. 定义计算器类中加.减.乘.除的方法. ...
- 34 异常机制 异常体系结构 Java把异常当做对象来处理 并定义一个基类java.lang.Throwable作为所有异常的超类 Error Exception
异常体系结构 概念 Java把异常当做对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类. 在Java API中已经定义了许多异常类,这些异常类分为两大类,错误Erro ...
- Python定义一个函数
Python函数:实现某种功能的代码段 定义一个函数需要遵循的规则: 1.使用 def 关键字 函数名和( ),括号内可以有形参 匿名函数使用 lambda 关键字定义 2.任何传入参数和自变量必须放 ...
随机推荐
- mybatis集成redis
系统原生集成的Ehcache, 但是监控需要(version 2.7),Ehcache Monitor http://www.ehcache.org/documentation/2.7/operati ...
- ODBC 驱动程序管理器 在指定的 DSN 中,驱动程序和应用程序之间的体系结构不匹配 解决方案
程序报错如下: ---------------------------Microsoft 数据链接错误---------------------------测试连接失败,因为初始化提供程序时发生错误. ...
- Docker(十九)-Docker监控容器资源的占用情况
启动一个容器并限制资源 启动一个centos容器,限制其内存为1G ,可用cpu数为2 [root@localhost ~]# docker run --name os1 -it -m 1g --cp ...
- 转载: 一、linux cpu、内存、IO、网络的测试工具
来源地址: http://blog.csdn.net/wenwenxiong/article/details/77197997 记录一下 以后好找.. 一.linux cpu.内存.IO.网络的测试工 ...
- jquery ajax中data属性详解
$.post.$.get是一些简单的方法,如果要处理复杂的逻辑,还是需要用到jQuery.ajax() 一.$.ajax的一般格式 $.ajax({ type: 'POST', url: url , ...
- ionic创建项目失败
× Downloading and extracting blank starter - failed![ERROR] Network connectivity error occurred, are ...
- 关于supervisor 的使用以及配置
首先我个人认为,用python实现的supervisor使用了守护进程这个概念去实现一个包裹进程的概念. 他可以帮助你的进程完成失效重启,日志记录,确保在线,关机自启动等一系列的功能. 当使用supe ...
- MySQL中条件放在where后面与放在on后面的区别
假设有两种表:test_on_position表和address表,address表存放地址,test_on_position存放会员及其常用的地址,数据如下: address表: test_on_p ...
- python之pygal:掷两个不同的骰子并统计大小出现次数
代码示例: # 掷两个不同的骰子并统计大小出现次数 import pygal from die_class import Die die = Die(6) # 实例化一个六面的骰子对象 die_10 ...
- mybatis的缓存机制(一级缓存二级缓存和刷新缓存)和mybatis整合ehcache
1.1 什么是查询缓存 mybatis提供查询缓存,用于减轻数据压力,提高数据库性能. mybaits提供一级缓存,和二级缓存. 一级缓存是SqlSession级别的缓存.在操作数据库时需要构造 s ...