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'))

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM