一般来说对于其他语言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__方法的更多相关文章

  1. 最终版的Web(Python实现)

    天啦,要考试了,要期末考试了,今天把最终版的Python搭建Web代码先写这里记下了.详细的过程先不写了. 这次是在前面的基础上重写 HTTPServer 与 BaseHTTPRequestHandl ...

  2. python之 __getattr__、__getattr__、__getitem__、__setitem__ 使用

    python之 __getattr__.__getattr__.__getitem__.__setitem__ 使用 __getattr__内置使用点号获取实例属性属性如 s.name,自调用__ge ...

  3. python 面向对象之反射及内置方法

    面向对象之反射及内置方法 一.静态方法(staticmethod)和类方法(classmethod) 类方法:有个默认参数cls,并且可以直接用类名去调用,可以与类属性交互(也就是可以使用类属性) 静 ...

  4. python面向对象之反射和内置方法

    一.静态方法(staticmethod)和类方法(classmethod) 类方法:有个默认参数cls,并且可以直接用类名去调用,可以与类属性交互(也就是可以使用类属性) 静态方法:让类里的方法直接被 ...

  5. Python Study (01) 之 特殊方法

    Python深入:特殊方法和多范式 Python是一切皆对象,意思就是python的天生就是个"纯面向对象语言"呀. 但是!!! Python还是一个多范式语言(multi-par ...

  6. python中的魔术属性与魔法方法

    1.魔法属性 · 1.1__doc__魔法属性  表示类的描述信息 class Fo: """ 这是今天第一个魔术属性__doc__""" ...

  7. Python中类的特殊属性和魔术方法

    1.属性 属性 含义 __name__ 类.函数.方法等的名字   __dir__ __module__ 类定义所在的模块名 __class__ 对象或类所属的类   只是返回基类 __bases__ ...

  8. RHEL 6.0服务器安装Oracle 11G R2 最终版

    RHEL6安装Oracle 11g R2最终版 结合网上教程 服务器实战所得 1.使用DVD做yum源新建dvd挂载目录[root@fxq-dp ~]# mkdir /media/iso进入到DVD挂 ...

  9. python动态获取对象的属性和方法 (转载)

    首先通过一个例子来看一下本文中可能用到的对象和相关概念. #coding:utf-8 import sys def foo():pass class Cat(object): def __init__ ...

随机推荐

  1. 『编程题全队』Beta 阶段冲刺博客二

    1.提供当天站立式会议照片一张 2.每个人的工作 (有work item 的ID) (1) 昨天已完成的工作 孙志威: 1.添加了SubTask类,完成基本UI 2.为SubTask类添加了展开/收缩 ...

  2. PHP使用Redis实现消息队列

    消息队列可以使用MySQL来实现,可以参考博客PHP使用MySQL实现消息队列,虽然用MySQL可以实现,但是一般不这么用,因为MySQL的数据都存在硬盘中,而从硬盘中对MySQL的操作,I/O花费的 ...

  3. PAT 1023 组个最小数

    https://pintia.cn/problem-sets/994805260223102976/problems/994805298269634560 给定数字0-9各若干个.你可以以任意顺序排列 ...

  4. TDD中测试替身学习总结

    在使用TDD开发时,经常会遇到需要被测对象需要依赖其他子系统的情况,但是你希望将测试代码跟依赖项隔离,以保证测试代码仅仅针对当前被测对象或方法展开,这时候你需要的是测试替身.测试替身可以分为四类:- ...

  5. Appium学习笔记3_Genymotion模拟器安装

    如果你已经配置好了安卓的运行环境,也配置好了自带的模拟器AVD,而且也launch了你的安卓模拟器,那么我相信你是不再愿意launch安卓模拟器第二次了,因为实在是太卡了(当然如果你电脑的配置够高,你 ...

  6. delphi 通过事务插入数据

    orsn1.StartTransaction; try qry1.Sql.Clear; qry1.Sql.Text:=' select * from log '; qry1.Open; qry1.In ...

  7. Python连接字符串用join还是+

    我们先来看一下用join和+连接字符串的例子 str1 = " ".join(["hello", "world"]) str2 = &quo ...

  8. Java监听器Listener的使用详解

    监听器用于监听Web应用中某些对象的创建.销毁.增加,修改,删除等动作的发生,然后作出相应的响应处理.当监听范围的对象的状态发生变化的时候,服务器自动调用监听器对象中的方法.常用于统计网站在线人数.系 ...

  9. Python3网络爬虫(1):利用urllib进行简单的网页抓取

    1.开发环境 pycharm2017.3.3 python3.5 2.网络爬虫的定义 网络爬虫,也叫网络蜘蛛(web spider),如果把互联网比喻成一个蜘蛛网,spider就是一只在网上爬来爬去的 ...

  10. MT【71】数列裂项放缩题

    已知${a_n}$满足$a_1=1,a_{n+1}=(1+\frac{1}{n^2+n})a_n.$证明:当$n\in N^+$时, $(1)a_{n+1}>a_n.(2)\frac{2n}{n ...