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(8080)
    tornado.ioloop.IOLoop.instance().start()

 

posted @ 2018-03-08 16:53  山上有风景  阅读(387)  评论(0编辑  收藏  举报