zoukankan      html  css  js  c++  java
  • python---定义一个session类

    首先:注意cookie中的get_cookie是返回字符串,而get_secure_cookie返回的是字节类型

                #self.get_secure_cookie()
                #The decoded cookie value is returned as a byte string (unlike
                #`get_cookie`).

    md5加密获取的十六进制也是返回的字符串类型

            import hashlib
            import time
            obj = hashlib.md5()
            obj.update(bytes(str(time.time()), encoding="utf8"))#传入byte类型
            random_str = obj.hexdigest()#返回字符串
            """ Return the digest value as a string of hexadecimal digits. """

    以下是自定义的session类,以及使用:

    import tornado.web
    
    #放在内存 redis  文件  数据库
    container={}
    
    #定义一个session类
    class Session:
        def __init__(self,handler):
            self.handler=handler
            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中加入随机字符串
            #加入自定义数据
            #在客户端中写入随机字符串
            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()
            if not container.get(random_str,None):
                container[random_str]={}
            container[random_str][key]=value
            #加入客户端
            self.handler.set_cookie('py_session',random_str)
    
    
        def get_value(self,key):
            #先去获取客户端的随机字符串
            #从container中获取自定义数据
            random_str=self.handler.get_cookie('py_session',None)
            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)
                s.set_value('is_login',True)
                #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("登录成功")
            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)

     但是上述类存在一个bug,会多产生一个数据,占用空间

                #在这里有个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'))
  • 相关阅读:
    Mac上的常用软件
    Mac上在iterm2中使用ls时,出现Operation not permitted
    Typora常用操作
    Mac上的qemusystemaarch64占用太多内存
    软件质量管理总结
    postgres使用记录
    Linux 包含中文字符的文件名无法使用shell 选中或复制
    常见硬件知识
    iterm2 常用操作
    C# 通过 HTTPModule 防范 DOS
  • 原文地址:https://www.cnblogs.com/ssyfj/p/8527687.html
Copyright © 2011-2022 走看看