python---session(最终版)__setitem__和__getitem__方法
一般来说对于其他语言session值一般获取方法为session['name'],赋值使用session['name']=val
对于python类中含有一些魔术方法__setitem__,__getitem__,__delitem__等,其中这三个可以用于索引操作,如字典。以上分别表示获取、设置、删除数据
最终版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 __setitem__(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 __getitem__(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 BaseRequestHandler(tornado.web.RequestHandler):
#tornado预留钩子函数
def initialize(self):
self.session=Session(self) class IndexHandler(BaseRequestHandler):
def get(self):
if self.get_argument('u',None) in ['asd','zxc']:
#在这里有个bug,当程序两次设置值时,逻辑相同,但是由于只发送了一次请求,获取了第一次的py_session
#在相同逻辑代码处理下random_str=self.handler.get_cookie('py_session')
#每次都是不正确的,都需要重新创建一个标识符
#但是后面的刷新过程中由于修改了客户区的py_session,所以可以正常进行操作,但是第一次产生的py_session的依旧存在服务端
#self.session.set_value('is_login',True)
#self.session.set_value('name',self.get_argument('u'))
self.session['is_login']=True
self.session['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(BaseRequestHandler):
def get(self, *args, **kwargs):
val = self.session['is_login']
if val:
self.write("登录成功"+self.session['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()
tornado.ioloop.IOLoop.instance().start()
python---session(最终版)__setitem__和__getitem__方法的更多相关文章
- 最终版的Web(Python实现)
天啦,要考试了,要期末考试了,今天把最终版的Python搭建Web代码先写这里记下了.详细的过程先不写了. 这次是在前面的基础上重写 HTTPServer 与 BaseHTTPRequestHandl ...
- python之 __getattr__、__getattr__、__getitem__、__setitem__ 使用
python之 __getattr__.__getattr__.__getitem__.__setitem__ 使用 __getattr__内置使用点号获取实例属性属性如 s.name,自调用__ge ...
- python 面向对象之反射及内置方法
面向对象之反射及内置方法 一.静态方法(staticmethod)和类方法(classmethod) 类方法:有个默认参数cls,并且可以直接用类名去调用,可以与类属性交互(也就是可以使用类属性) 静 ...
- python面向对象之反射和内置方法
一.静态方法(staticmethod)和类方法(classmethod) 类方法:有个默认参数cls,并且可以直接用类名去调用,可以与类属性交互(也就是可以使用类属性) 静态方法:让类里的方法直接被 ...
- Python Study (01) 之 特殊方法
Python深入:特殊方法和多范式 Python是一切皆对象,意思就是python的天生就是个"纯面向对象语言"呀. 但是!!! Python还是一个多范式语言(multi-par ...
- python中的魔术属性与魔法方法
1.魔法属性 · 1.1__doc__魔法属性 表示类的描述信息 class Fo: """ 这是今天第一个魔术属性__doc__""" ...
- Python中类的特殊属性和魔术方法
1.属性 属性 含义 __name__ 类.函数.方法等的名字 __dir__ __module__ 类定义所在的模块名 __class__ 对象或类所属的类 只是返回基类 __bases__ ...
- RHEL 6.0服务器安装Oracle 11G R2 最终版
RHEL6安装Oracle 11g R2最终版 结合网上教程 服务器实战所得 1.使用DVD做yum源新建dvd挂载目录[root@fxq-dp ~]# mkdir /media/iso进入到DVD挂 ...
- python动态获取对象的属性和方法 (转载)
首先通过一个例子来看一下本文中可能用到的对象和相关概念. #coding:utf-8 import sys def foo():pass class Cat(object): def __init__ ...
随机推荐
- JWT验证
理解 JSON Web Token(JWT) 验证 JSON Web Token认证的操作指南 在本文中,我们将了解JSON Web Token的全部内容. 我们将从JWT的基本概念开始,然后查看其结 ...
- 微信小程序cavas画图并保存
需求背景: 因微信小程序暂不支持一键分享到朋友圈功能,故要生成图片并保存到手机相册就有两种情况: 1.需保存的图片为静态固定图片.这种情况图片可直接由后端返回,再调用小程序相应api直接保存到手机相册 ...
- 3-Python3从入门到实战—基础之数据类型(数字-Number)
Python从入门到实战系列--目录 Python3 中有六个标准的数据类型: Number(数字) String(字符串) List(列表) Tuple(元组) Sets(集合) Dictionar ...
- PAT 甲级 1130 Infix Expression
https://pintia.cn/problem-sets/994805342720868352/problems/994805347921805312 Given a syntax tree (b ...
- windows下net命令失败
D:\apache-tomcat-7.0.57\bin>net start mysql57发生系统错误 5. 拒绝访问. 以管理员身份运行 run as administrator 打开cmd. ...
- Jquery Jquery对象和DOM对象的微妙联系
声明变量 var $variable= Jquery 对象: var varibake= DOM对象: var $cr= $("#id&q ...
- jest & puppeteer & 单元测试 & 集成测试
jest & puppeteer 单元测试 & 集成测试 单元测试,就是测试一个函数或某个代码片段,通过模拟输入确保输出符合预期 集成测试,测的是一个功能模块,比如用户注册功能,集成测 ...
- 【Java】 内部类
[Java]内部类 可以将一个类的定义放在另一个类的定义内部,这就是内部类. 使用内部类的的原因主要有三点: 内部类方法可以访问该类定义所在的作用域中的数据,包括私有的数据. 内部类可以对同一个包中的 ...
- Markdown 文件转化为work文档
1. 电脑安装pandoc 链接:https://pan.baidu.com/s/12H5wLO0JWph5TjrbeJI6mg 密码:ssgs 下载安装包解压即可用.记得配置系统环境变量 2.命令行 ...
- BZOJ4541 HNOI2016矿区(平面图转对偶图)
考虑先将平面图转化为对偶图.具体地,将无向边拆成两条有向边.每次考虑找到包围一个区域的所有边.对当前考虑的边,找到该边的反向边在该边终点的出边集中,按极角序排序的后继,这条后继边也是包围该区域的边.这 ...