Tornado框架04-cookie

貓xian森發表於2017-03-16

cookie的本質其實就是在瀏覽器端儲存的鍵值對, 每當瀏覽器端傳送一次請求, 都會將這些鍵值對附加在請求中併傳送給伺服器端.

我們簡單使用下python中的cookie:

Tornado框架04-cookie
專案目錄

home.py檔案:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import tornado.web


class IndexHandle(tornado.web.RequestHandler):
    def get(self):
        username = self.get_argument('u', None)
        if not username:
            self.set_cookie('name', 'test')
            self.set_secure_cookie('user', 'test')
            self.redirect('/admin')

    def post(self):
        pass


class AdminHandle(tornado.web.RequestHandler):
    def get(self, *args, **kwargs):
        name = self.get_cookie('name', None)
        user = self.get_cookie('user', None)
        print('name: ', name, "\nuser: ", user)複製程式碼

start.py檔案:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import tornado.web, tornado.ioloop
from controllers import home

if __name__ == '__main__':
    settings = {
        # 模板路徑配置
        'template_path': 'views',
        "cookie_secret": 'test-secret,'
    }

    application = tornado.web.Application([
        (r"/index", home.IndexHandle),
        (r"/admin", home.AdminHandle),
    ], **settings)
    application.listen(80)
    tornado.ioloop.IOLoop.instance().start()複製程式碼

Tornado框架04-cookie
瀏覽器端檢查`cookie`情況

Tornado框架04-cookie
伺服器端輸出`cookie`情況

  • self.set_cookie('name', 'test') 設定未加密的cookie, 鍵為'name', 值為test
  • self.set_secure_cookie('user', 'test') 設定加密cookie, 鍵為'user', 值為test. 設定加密cookie我們需要在配置中新增自定義的加密串(俗稱對加密結果加鹽)"cookie_secret": 'test-secret,'
  • name = self.get_cookie('name', None)獲取指定key未加密的cookie的值
  • user = self.get_cookie('user', None) 獲取指定key的加密後的cookie的值
  • 對於set_cookie()set_secure_cookie()都用以下常見引數
    • name 表示傳入cookie的鍵
    • value 表示傳入cookiename對應的值
    • domain=None 表示域名
    • expires=None 設定過期時間, 這裡單位為秒
    • path="/" 表示當前的cookie在那些路徑下有效, /表示當前域名下所有的路徑均有效
    • expires_days=None 設定過期時間, 單位為天

接下來我們談談加密cookie的加密和解密原理:

Tornado框架04-cookie
加密過程

  • 解密時候將加密cookie中的base64(test)也就是加密後的值和時間戳再加上cookie_secret生成新的加密串和加密cookie中的加密串比較, 若相同則合法驗證通過, 然後再通過反解加密base64(test)取其本來的值

相關文章