1. 程式人生 > >Tornado中的cookies與session的設定

Tornado中的cookies與session的設定

1.在帶有(繼承)自RequestHandler的類中

#設定
self.set_cookie('mycookie','hello_world',expires_days=10)#10天過期
#獲取
info = self.get_cookie('mycookie')

2.由於tornado框架沒有實現session的機制,我們就可以自己建立類來實現

#僅供參考
#MySeesion用來儲存客戶端資訊
#儲存格式:
# 鍵 id
# 值 {}     #記錄使用者的行為

# 1345682423894:{'islogin':'True'}
# 192391280389e:{'aaa':'bbb','ccc':'ddd'}
from day0201.util.myutils import myuuid

session={}


#模擬實現session機制
class MySession:
    def __init__(self,handler):       #必須傳遞一個handler物件,才能在下面使用get_cookie()方法去實現
        self.handler = handler

    def __getitem__(self, key):

        id = self.handler.get_cookie('cookieid')
        if id:
            #根據id取出對應的儲存在伺服器上的資訊
            info = session.get(id,None)
            if info:
                return info.get(key,None)
            else:
                return None

        else:
            return None

    def __setitem__(self, key, value):

        id = self.handler.get_cookie('cookieid')

        if id:
            info = session.get(id,None)
            if info:
                info[key] = value
            else:
                d = dict()
                d[key] = value
                session[id] = d
        else:
            d = dict()
            d[key] = value
            #為客戶端指定一個uuid充當id值
            id = myuuid()        #這是一個具體的演算法
            session[id] = d
            #並將id以cookie的形式寫回給瀏覽器
            self.handler.set_cookie('cookieid',id,expires_days=10)



以上session來時一個tornado的部落格專案,完整的程式碼可以參見github地址

3.前端的實現

首先檢測,如果登入則直接跳轉到部落格頁

class IndexHandler(MyRequestHandler):
    def initialize(self):
        print('initialize方法執行')
    #響應以get方式發起的請求
    def get(self, *args, **kwargs):
        print('get方法執行')

        print('uuid值------>',myuuid())

        #給瀏覽器一個cookie
        self.set_cookie('mycookie','hello_world',expires_days=10)#10天過期

       #session = MySession(self)

        islogin = self.session['islogin']

        if islogin:
            self.redirect('/blog')
        else:
            #伺服器給瀏覽器的響應內容
            self.render('login.html')



    #響應以post方式發起的請求
    def post(self, *args, **kwargs):
        pass

    def on_finish(self):
        print('on_finish方法執行')

部落格頁,如果沒有登入,則跳轉到登入頁

class BlogHandler(MyRequestHandler):

    def my_rand(self,a,b):
        return random.randint(a,b)

    def get(self, *args, **kwargs):

        #session = MySession(self)
        islogin = self.session['islogin']
        if islogin:
            self.render('blog.html')
        else:
            self.redirect('/')

    def post(self, *args, **kwargs):
        pass
class LoginHandler(MyRequestHandler):
    def get(self, *args, **kwargs):
        pass
    def post(self, *args, **kwargs):
        name = self.get_body_argument('name',None)
        password = self.get_body_argument('password',None)

        if self.application.dbutil.isloginsuccess(name,password):

            #登入成功我要在session中進行記錄
            #session = MySession(self)
            self.session['islogin'] = True
            self.redirect('/blog')
        else:
            self.redirect('/?msg=fail')

其中的myRequestHandler是對requestHandler的再一次分裝,不過的注意這個__init__()的引數傳遞

from tornado.web import RequestHandler

from day0201.util.mysession import MySession


class MyRequestHandler(RequestHandler):
    def __init__(self,application, request, **kwargs):
        super().__init__(application, request, **kwargs)
        self.session = MySession(self)