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.任何传入参数和自变量必须放 ...
随机推荐
- MySql修改root密码以及允许外网访问
1.修改root密码 用SET PASSWORD命令 mysql -u root mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('n ...
- A Survey of Machine Learning Techniques Applied to Software Defined Networking (SDN): Research Issues and Challenges
将机器学习用到SDN中的综述:研究的问题和挑战 从流量分类.路由优化.服务质量(Qos)/体验质量(QoE)预测.资源管理和安全性的角度,回顾了机器学习算法如何应用于SDN领域. 相关知识 在SDN中 ...
- [转帖]ARM 相关内容
ARM内核全解析,从ARM7,ARM9到Cortex-A7,A8,A9,A12,A15到Cortex-A53,A57 http://www.myir-tech.com/resource/448.asp ...
- Linux标准输入、输出和错误和文件重定向 专题
当我们在shell中执行命令的时候,每个进程都和三个打开的文件相联系,并使用文件描述符来引用这些文件.由于文件描述符不容易记忆,shell同时也给出了相应的文件名. 下面就是这些文件描述符及它们通常所 ...
- 归并排序详解(python实现)
因为上个星期leetcode的一道题(Median of Two Sorted Arrays)所以想仔细了解一下归并排序的实现. 还是先阐述一下排序思路: 首先归并排序使用了二分法,归根到底的思想还是 ...
- D3.js & Data Visualization & SVG
D3.js & Data Visualization & SVG https://davidwalsh.name/learning-d3 // import {scaleLinear} ...
- 掌上电脑设备可以使用Ubuntu MATE 18.10 Linux映像了
就在几天前,Ubuntu 18.10发布了.操作系统被称为“Cosmic Cuttlefish”,有多种版本可供选择,除了常见的GNOME -- Xfce (Xbuntu), KDE (Kubuntu ...
- 好消息,Manjaro Linux 18 已正式发布!
导读 Manjaro Linux 18 已正式发布!Xfce 版本仍然是旗舰,Manjaro 为其提供了优雅且领先的集成体验.这一版本搭载 Xfce 4.13. 这一版本主要专注于在桌面和窗口管理器上 ...
- iTunes 12.7 没有应用程序选项了,重新安装iTunes 12.6.3
iTunes 12.6.3 下载地址: Mac http://t.cn/RO5rIfE Win 32 http://t.cn/ROtta1T Win64 http://t.cn/ROtta1n 安装好 ...
- BZOJ3298[USACO 2011Open]cow checkers——威佐夫博弈
题目描述 一天,Besssie准备和FJ挑战奶牛跳棋游戏.这个游戏上在一个M*N的棋盘上, 这个棋盘上在(x,y)(0<=x棋盘的左下角是(0,0)坐标,棋盘的右上角是坐标(M-1,N-1). ...