1. import tornado.web
  2.  
  3. #放在内存 redis 文件 数据库
  4. container={}
  5.  
  6. #定义一个session类
  7. class Session:
  8. def __init__(self,handler):
  9. self.handler=handler
  10. self.random_str=None
  11. pass
  12.  
  13. def __genarate_random_str(self):
  14. import hashlib
  15. import time
  16. obj = hashlib.md5()
  17. obj.update(bytes(str(time.time()), encoding="utf8"))#传入byte类型
  18. random_str = obj.hexdigest()#返回字符串
  19. return random_str
  20.  
  21. def set_value(self,key,value):
  22. #在container中加入随机字符串
  23. #加入自定义数据
  24. #在客户端中写入随机字符串
  25. if not self.random_str:
  26. if self.handler.get_cookie('py_session'):
  27. random_str=self.handler.get_cookie('py_session')
  28. if not container.get(random_str,None):
  29. random_str = self.__genarate_random_str()
  30. else:
  31. random_str=self.__genarate_random_str()
  32.  
  33. self.random_str=random_str
  34. if not container.get(self.random_str,None):
  35. container[self.random_str]={}
  36. container[self.random_str][key]=value
  37. #加入客户端
  38. self.handler.set_cookie('py_session',self.random_str)
  39.  
  40. def get_value(self,key):
  41. #先去获取客户端的随机字符串
  42. #从container中获取自定义数据
  43. #random_str=self.handler.get_cookie('py_session',None)
  44. random_str=self.random_str
  45. dict_info=container.get(random_str,None)
  46. if not dict_info:
  47. return None
  48. return dict_info[key]
  49.  
  50. class IndexHandler(tornado.web.RequestHandler):
  51. def get(self):
  52. if self.get_argument('u',None) in ['asd','zxc']:
  53. s = Session(self)
  54. #在这里有个bug,当程序两次设置值时,逻辑相同,但是由于只发送了一次请求,获取了第一次的py_session
  55. #在相同逻辑代码处理下random_str=self.handler.get_cookie('py_session')
  56. #每次都是不正确的,都需要重新创建一个标识符
  57. #但是后面的刷新过程中由于修改了客户区的py_session,所以可以正常进行操作,但是第一次产生的py_session的依旧存在服务端
  58. s.set_value('is_login',True)
  59. s.set_value('name',self.get_argument('u'))
  60. #self.get_secure_cookie()
  61. #The decoded cookie value is returned as a byte string (unlike
  62. #`get_cookie`).
  63. else:
  64. self.write("请登录")
  65.  
  66. class ManagerHandler(tornado.web.RequestHandler):
  67. def get(self, *args, **kwargs):
  68. s=Session(self)
  69. val = s.get_value('is_login')
  70. if val:
  71. self.write("登录成功"+s.get_value('name'))
  72. else:
  73. self.redirect("/index")
  74.  
  75. settings ={
  76. 'template_path':'views',
  77. 'static_path':'statics',
  78. 'cookie_secret':'dafawafawfaw',
  79. }
  80.  
  81. application = tornado.web.Application([
  82. (r"/index",IndexHandler),
  83. (r"/manager",ManagerHandler),
  84. ],**settings)
  85.  
  86. if __name__=="__main__":
  87. application.listen(8080)
  88. tornado.ioloop.IOLoop.instance().start()

python---定义一个session类(无错)的更多相关文章

  1. python---定义一个session类

    首先:注意cookie中的get_cookie是返回字符串,而get_secure_cookie返回的是字节类型 #self.get_secure_cookie() #The decoded cook ...

  2. python定义接口继承类

    zxq547 python定义接口继承类invalid syntax解决办法 1 2 3 4 5 6 7 class s_all(metaclass=abc.ABCMeta):     #python ...

  3. 实验四 (1):定义一个形状类(Shape)方法:计算周长,计算面积

    (1)定义一个形状类(Shape)方法:计算周长,计算面积子类:矩形类(Rectangle) :额外的方法:differ() 计算长宽差圆形类(Circle)三角形类(Triangle)正方形类(Sq ...

  4. 定义一个Rectangle类,该类提供getLength和getWidth方法。

    import java.util.Comparator; /** * 定义一个Rectangle类,该类提供getLength和getWidth方法.利用图1-18中的findMax例程编写 * 一种 ...

  5. java定义一个Circle类,包含一个double型的radius属性代表圆的半径,一个findArea()方法返回圆的面积

    需求如下:(1)定义一个Circle类,包含一个double型的radius属性代表圆的半径,一个findArea()方法返回圆的面积. (2)定义一个类PassObject,在类中定义一个方法pri ...

  6. 定义一个Person类,其中包括:1.定义属性:姓名、年龄、民族作为成员变量。定义静态成员变量:人数2.定义构造方法:对成员变量进行初始化。3.定义多个方法:分别显示相应的属性值,例如getName(){System.out.print("名称="+name+";"); }4.定义一个方法“成长”:实现年龄的增加,每执行一次年龄增加1

    题目显示不全,完整题目描述: (1)定义一个Person类,其中包括:1.定义属性:姓名:年龄:民族作为成员变量.定义静态成员变量:人数2.定义构造方法:对成员变量进行初始化.3.定义多个方法:分别显 ...

  7. Java初学者作业——定义一个计算器类, 实现计算器类中加、 减、 乘、 除的运算方法, 每个方法能够接收2个参数。

    返回本章节 返回作业目录 需求说明: 定义一个计算器类, 实现计算器类中加. 减. 乘. 除的运算方法, 每个方法能够接收2个参数. 实现思路: 定义计算器类. 定义计算器类中加.减.乘.除的方法. ...

  8. 34 异常机制 异常体系结构 Java把异常当做对象来处理 并定义一个基类java.lang.Throwable作为所有异常的超类 Error Exception

    异常体系结构 概念 Java把异常当做对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类. 在Java API中已经定义了许多异常类,这些异常类分为两大类,错误Erro ...

  9. Python定义一个函数

    Python函数:实现某种功能的代码段 定义一个函数需要遵循的规则: 1.使用 def 关键字 函数名和( ),括号内可以有形参 匿名函数使用 lambda 关键字定义 2.任何传入参数和自变量必须放 ...

随机推荐

  1. mybatis集成redis

    系统原生集成的Ehcache, 但是监控需要(version 2.7),Ehcache Monitor http://www.ehcache.org/documentation/2.7/operati ...

  2. ODBC 驱动程序管理器 在指定的 DSN 中,驱动程序和应用程序之间的体系结构不匹配 解决方案

    程序报错如下: ---------------------------Microsoft 数据链接错误---------------------------测试连接失败,因为初始化提供程序时发生错误. ...

  3. Docker(十九)-Docker监控容器资源的占用情况

    启动一个容器并限制资源 启动一个centos容器,限制其内存为1G ,可用cpu数为2 [root@localhost ~]# docker run --name os1 -it -m 1g --cp ...

  4. 转载: 一、linux cpu、内存、IO、网络的测试工具

    来源地址: http://blog.csdn.net/wenwenxiong/article/details/77197997 记录一下 以后好找.. 一.linux cpu.内存.IO.网络的测试工 ...

  5. jquery ajax中data属性详解

    $.post.$.get是一些简单的方法,如果要处理复杂的逻辑,还是需要用到jQuery.ajax() 一.$.ajax的一般格式 $.ajax({ type: 'POST', url: url , ...

  6. ionic创建项目失败

    × Downloading and extracting blank starter - failed![ERROR] Network connectivity error occurred, are ...

  7. 关于supervisor 的使用以及配置

    首先我个人认为,用python实现的supervisor使用了守护进程这个概念去实现一个包裹进程的概念. 他可以帮助你的进程完成失效重启,日志记录,确保在线,关机自启动等一系列的功能. 当使用supe ...

  8. MySQL中条件放在where后面与放在on后面的区别

    假设有两种表:test_on_position表和address表,address表存放地址,test_on_position存放会员及其常用的地址,数据如下: address表: test_on_p ...

  9. python之pygal:掷两个不同的骰子并统计大小出现次数

    代码示例: # 掷两个不同的骰子并统计大小出现次数 import pygal from die_class import Die die = Die(6) # 实例化一个六面的骰子对象 die_10 ...

  10. mybatis的缓存机制(一级缓存二级缓存和刷新缓存)和mybatis整合ehcache

    1.1  什么是查询缓存 mybatis提供查询缓存,用于减轻数据压力,提高数据库性能. mybaits提供一级缓存,和二级缓存. 一级缓存是SqlSession级别的缓存.在操作数据库时需要构造 s ...