Tornado框架05-session

我們將許多信息放在cookie中勢必會造成瀏覽器端的臃腫, 此時便需要在服務端保存原本在瀏覽器端的那些鍵值對. 在瀏覽器端只需存儲一個表示身份的隨機加密字符串, 當瀏覽器端訪問服務端時候攜帶該字符串, 經(jīng)過比較, 驗證合法之后便可以取該用戶在服務端存儲的相應信息. 但是在Tornado中并沒有session的模塊, 我們需要自定義來實現(xiàn).

項目目錄

**all.py文件如下: **

#!/usr/bin/env python
# -*- coding:utf-8 -*-

# 存儲所有的用戶信息
ALL_USER_DIC = {}

**base.py文件如下: **

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


class BaseHandler(tornado.web.RequestHandler):
    # 鉤子函數(shù), 子類初始化時候會將子類對象傳入該方法中執(zhí)行
    def initialize(self):
        # 這里將子類對象傳入session中, 則以后生成的session對象中就包含處理器的實例對象
        self.session = Session(self)

**session.py文件如下: **

#!/usr/bin/env python
# -*- coding:utf-8 -*-
from commons.all import ALL_USER_DIC


class Session:
    def __init__(self, handler):
        self.handler = handler
        self.random_index_str = None

    def __get_random_str(self):
        import hashlib, time
        # 生成md5對象
        md = hashlib.md5()

        # 加入自定義參數(shù)來更新md5對象
        md.update(bytes(str(time.time()) + ' | own-secret', encoding='utf-8'))

        # 得到加鹽后的十六進制隨機字符串來作為用戶的索引
        return md.hexdigest()

    def __setitem__(self, key, value):
        # 當前session對象中沒有對應的索引的時候
        if not self.random_index_str:
            # 根據(jù)處理器對象獲得瀏覽器傳來的cookie的值
            random_index_str = self.handler.get_secure_cookie("__sson__", None)

            # 瀏覽器傳來的cookie的值為空的時候, 表示該用戶是第一次訪問本網(wǎng)站
            if not random_index_str:
                # 為當前的新用戶在當前的session對象中生成索引
                self.random_index_str = self.__get_random_str()
                # 為當前新用戶設置cookie
                self.handler.set_secure_cookie('__sson__', self.random_index_str)
                # 為當前用戶生成保存其相關內容的字典對象
                ALL_USER_DIC[self.random_index_str] = {}

            # 當瀏覽器傳來的cookie不為空的時候
            else:
                # 瀏覽器傳來的cookie非法的時候
                if self.random_index_str not in ALL_USER_DIC.keys():
                    # 為當前非法用戶生產(chǎn)索引
                    self.random_index_str = self.__get_random_str()
                    # 僅僅為當前非法用戶生成其保存相關內容的字典對象, 避免合法老用戶的字典對象被清空
                    ALL_USER_DIC[self.random_index_str] = {}

        # 不管當前session對象有沒有對應的索引都應該為他設置起相關的信息保存(當然了, 到這一步的時候經(jīng)過if條件語句的過濾, 剩下來的就是剛剛創(chuàng)建字典對象的新用戶或者非法用戶, 以及其他合法的老用戶了)
        ALL_USER_DIC[self.random_index_str][key] = value

        # 將為以上的新用戶或者非法用戶設置cookie的操作放在這里本無可厚非. 但是將老用戶的cookie也重新設置一遍, 其實是為老用戶更新過期時間而做的
        self.handler.set_secure_cookie('__sson__', self.random_index_str)

    def __getitem__(self, key):
        # 獲取當前用戶cookie中保存的索引值, 注意加密方式返回的cookie的值是bytes類型的
        self.random_index_str = self.handler.get_secure_cookie('__sson__', None)
        # 若索引值為空表示當前用戶是新用戶, 則直接返回空, 程序到此終止
        if not self.random_index_str:
            return None

        # 索引不為空的時候
        else:
            self.random_index_str = str(self.random_index_str, encoding="utf-8")
            # 在服務器端為保存該索引值表示當前用戶是非法用戶,則直接返回空
            current_user = ALL_USER_DIC.get(self.random_index_str, None)
            if not current_user:
                return None
            else:
                # 直接返回合法用戶指定的key的值, 沒有則默認返回空
                return current_user.get(key, None)

**home.py文件如下: **

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


class IndexHandler(BaseHandler):
    def get(self):
        if self.get_argument('name', None) == 'test':
            self.session['is_login'] = True
            self.session['name'] = self.get_argument('name')
        else:
            self.write('登錄失敗, 請重新登錄!')


class AdminHandler(BaseHandler):
    def get(self):
        if self.session['is_login']:
            self.write('歡迎%s回來. ' % (self.session['name'],))
        else:
            self.redirect('/index')

**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.IndexHandler),
        (r"/admin", home.AdminHandler),
    ], **settings)
    application.listen(80)
    tornado.ioloop.IOLoop.instance().start()
運行結果-1
運行結果-2
  • 至此我們就完成了基于加密cookie方式的session服務端驗證
  • 注意, 獲取加密方式的cookie的值是bytes類型的, 一定要記得轉成str類型, 否則用bytes去找str類型是無法匹配成功, 直接會造成即使登錄成功, 也無法訪問到admin成功的頁面(筆者就曾掉進此坑了掙扎好久)
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末吸耿,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子伴网,更是在濱河造成了極大的恐慌妆棒,老刑警劉巖沸伏,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件动分,死亡現(xiàn)場離奇詭異澜公,居然都是意外死亡,警方通過查閱死者的電腦和手機坟乾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門甚侣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人贺喝,你說我怎么就攤上這事宗兼〉桑” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵主到,是天一觀的道長躯概。 經(jīng)常有香客問我,道長牧牢,這世上最難降的妖魔是什么姿锭? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任呻此,我火速辦了婚禮,結果婚禮上焚鲜,老公的妹妹穿的比我還像新娘。我一直安慰自己糯彬,他們只是感情好,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布叽粹。 她就那樣靜靜地躺著却舀,像睡著了一般挽拔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上螃诅,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天术裸,我揣著相機與錄音,去河邊找鬼搀崭。 笑死猾编,一個胖子當著我的面吹牛,可吹牛的內容都是我干的答倡。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼设江!你這毒婦竟也來了?” 一聲冷哼從身側響起码俩,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤稿存,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后瓣履,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年辜贵,在試婚紗的時候發(fā)現(xiàn)自己被綠了归形。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡厚棵,死狀恐怖蔼紧,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情柿祈,我是刑警寧澤哩至,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布蜜自,位于F島的核電站重荠,受9級特大地震影響,放射性物質發(fā)生泄漏戈鲁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一诈乒、第九天 我趴在偏房一處隱蔽的房頂上張望婆芦。 院中可真熱鬧喂饥,春花似錦员帮、人聲如沸导饲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽泡挺。三九已至,卻和暖如春娄猫,著一層夾襖步出監(jiān)牢的瞬間媳溺,已是汗流浹背月幌。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工扯躺, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蝎困,地道東北人。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓澎埠,卻偏偏與公主長得像始藕,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子江耀,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理祥国,服務發(fā)現(xiàn)倍踪,斷路器索昂,智...
    卡卡羅2017閱讀 134,599評論 18 139
  • Http協(xié)議詳解 標簽(空格分隔): Linux 聲明:本片文章非原創(chuàng)扩借,內容來源于博客園作者MIN飛翔的HTTP協(xié)...
    Sivin閱讀 5,203評論 3 82
  • 作者:晚晴幽草軒www.jeffjade.com/2016/10/31/115-summary-of-cookie...
    饑人谷_Dylan閱讀 1,222評論 0 51
  • 不知道做門店的朋友有沒有這樣的經(jīng)歷,明明自己的門店的銷售銷量還不錯潮罪,利潤還可以康谆,但是一個月下來利潤卻并不是很理想這...
    騎豬去賣貨閱讀 203評論 0 0
  • 我終于發(fā)現(xiàn)為什么很多人推薦年輕人去看一些名人的傳記了沃暗,是想讓年輕人學習他們的精神,學習他們品德何恶,學習他們做人做事的...
    一直走別回頭M閱讀 443評論 0 0