Tornado Cookies 登錄認證 異步

1.Cookie

    # 向cookie中存儲數(shù)據(jù)
    self.set_cookie("info", "msg")
    #取cookie中的數(shù)據(jù)
    info_ = self.get_cookie("info")

    #但上面簡單的cookies直接顯示數(shù)據(jù)甩卓,容易被他人利用珠增,使用加密的cookie
    # 向cookie中存儲數(shù)據(jù)
    self.set_secure_cookie("info", "msg")
    info_ = self.get_secure_cookie("info")
    #添加混淆碼论泛,加密cookie
    app = Application(
        [......],
        #混淆碼一般用 base64.b64encode 格式的隨機碼
        cookie_secret='yYsdHBeySj2XPhzewQYsycmLHRwXsko9lz4c3sEGLMnJix0cF7JKPZc+HN7BBizJ'
    )
    #清除cookie
    clear_cookie()

cookie有時間設(shè)置茴恰,通過self.cookie(name, value, expires_days)來給添加一個cookie數(shù)據(jù),如果不設(shè)置過期時間expries_days,該cookie就是一個會話級別的臨時cookie着帽,一旦會話超時或者瀏覽器完全關(guān)閉的情況下揣钦,cookie中存儲的數(shù)據(jù)就會丟失;如果設(shè)置了過期時間expires_days該cookie就是一個永久cookie涨岁,永久的cookie默認為30天時限拐袜。
永久時間設(shè)置:為None時,關(guān)閉會話立即失效梢薪, 小于等于0時cookie沒作用蹬铺,創(chuàng)建后立即過期。

  • 附加
    #轉(zhuǎn)碼encode
    #解碼decode
    #禁止跨域請求秉撇,APP添加設(shè)置
    xsrf_cookies=True, 
    #前端網(wǎng)頁請求時添加令牌
    {% module xsrf_form_html() %}

2.登錄認證

    #導入登錄認證模塊
    from tornado.web import  authenticated
    #在函數(shù)處理中添加 get_current_user()函數(shù)丛塌,判斷current_user當前用戶是否登錄的認證。
    #重寫get_current_user()函數(shù)~指定在什么情況下用戶是登錄狀態(tài)畜疾!
    def get_current_user(self):
        name = self.get_secure_cookie("login")
        if name is not None:
            return True
        return False

    # authenticated裝飾器~用于判斷用戶是否具有登錄狀態(tài)
    @authenticated
    def get(self):
        # 獲取cookie中的數(shù)據(jù)
        name = self.get_secure_cookie("login")
        self.render("index.html", name=name)

    if __name__ == "__main__":
        app = Application(
            [......],   
            #設(shè)置錯誤信息顯示是否詳細
            debug=True,
            #這是登錄認證判斷沒有登錄(cookie ‘login’ 沒有用戶)時跳轉(zhuǎn)的路由
            #當完成登錄時會自動返回當時請求的頁面赴邻。有記憶功能。
            login_url='/login',
    )

3.異步

  • 前端異步
    通過前端Ajax實現(xiàn)異步處理啡捶,和其他服務(wù)器項目進行數(shù)據(jù)通信
    如:天氣預(yù)報 http://wthrcdn.etouch.cn/weather_mini?city=
    通過前端頁面提交城市到天氣預(yù)報服務(wù)器查詢姥敛,返回數(shù)據(jù)到前端頁面,自己服務(wù)器不參與瞎暑。
    注意:有時數(shù)據(jù)返回的是字符串彤敛,要轉(zhuǎn)化為json格式供自己使用
        // 獲取天氣數(shù)據(jù),轉(zhuǎn)換數(shù)據(jù)~string->json
        var _weather = JSON.parse(data).data;
    
        // DOM操作渲染數(shù)據(jù)
        var $today1 = $("<p>").text("日期:" + _weather.forecast[0].date);
    
  • 后端同步
    前端請求時了赌,通過自己的服務(wù)器向他人的服務(wù)器獲取數(shù)據(jù)墨榄,再返還給前端。
        # 引入需要的模塊
        from tornado.httpclient import HTTPClient
    
        # 定義一個天氣預(yù)報處理類
        class WeatherHandler(RequestHandler):
             # 同步方式~從其他服務(wù)器獲取數(shù)據(jù)
             def get(self):
             #前端接收的數(shù)據(jù)
             city = self.get_argument("city")
             # 創(chuàng)建一個客戶端對象
             client = HTTPClient()
             # 抓取指定的url地址中的數(shù)據(jù)勿她,得到一個響應(yīng)對象response
             #抓取到的數(shù)據(jù)是存放在body屬性中
             response = client.fetch("http://wthrcdn.etouch.cn/weather_mini?city=" + city)
             self.write(response.body)
    
  • 后端異步
    過程類似同步袄秩,只是方法不一樣。
        #異步操作對象 模塊
        from tornado.httpclient import AsyncHTTPClient 
    
        #定義異步操作天氣預(yù)報的視圖處理類
        class WeatherHandler(RequestHandler):
        #通過注解裝飾器,告訴tornado這個get處理方法是異步的~不需要自動返回數(shù)據(jù)
        @asynchronous
        def get(self):
            #獲取參數(shù)數(shù)據(jù)
            city = self.get_argument("city")
            # 創(chuàng)建一個異步操作對象
            client = AsyncHTTPClient()
            # 異步對象抓取數(shù)據(jù)
            client.fetch("http://wthrcdn.etouch.cn/weather_mini?city=" + city, 
                                    callback=self.deal_response)
    
         #這個函數(shù)就是異步對象的回調(diào)函數(shù)之剧,當異步數(shù)據(jù)獲取完成時調(diào)用執(zhí)行的函數(shù)
         def deal_response(self, response):
             content = response.body
             # 將數(shù)據(jù)返回給前端頁面
             self.write(content)
             # 通過finish()函數(shù)告訴tornado異步操作結(jié)束郭卫,手工控制返回數(shù)據(jù)
             self.finish()
    

附加:
后端同步與異步的區(qū)別:通過siege壓力測試工具壓力測試,可以看出同步與異步的差距背稼。
當并發(fā)量與訪問時間相同時贰军,異步的處理效率遠高于同步的方式。

4.長連接

一般實現(xiàn)聊天室蟹肘,網(wǎng)頁客服等

  • 前端頁面
       <script>
            // 創(chuàng)建一個js中的 websocket 對象词疼,保持和服務(wù)器之間的通信
            // var _websocket = new WebSocket("websocket連接字符串,使用websocket協(xié)議連接")
            var _websocket = new WebSocket("ws://192.168.11.102:8000/chat");
            // 隨時等待接收服務(wù)器的消息:保持一個長連接帘腹,一旦服務(wù)器有消息的話贰盗,需要實時接收。
            _websocket.onmessage = function(e) {
                  // 接受服務(wù)器發(fā)送的數(shù)據(jù) e 一般默認為 e
                  var _content = e.data; 
            };
            $("#send").click(function() {
                  // 當點擊按鈕的時候竹椒,需要給服務(wù)器發(fā)送數(shù)據(jù)
                  var $msg = $("#msg").val();
                  _websocket.send($msg)
            })
            // 處理讓消息窗口的滾動條顯示在最底下的位置
            $("#history").scrollTop($("#history")[0].scrollHeight)
       </script>
    
  • 后端服務(wù)器
        #導入后端服務(wù)器長連接模塊
        from tornado.websocket import WebSocketHandler
    
        # 定義聊天消息長連接處理類
        #和客戶端保持長連接的視圖處理類需要重寫父類的方法完成和客戶端的通信
        class ChatHandler(WebSocketHandler):
              # 定義一個保存所有用戶的集合 set()
              online_users = set()
    
              # 1.重寫open()函數(shù)童太,保存接入的用戶數(shù)據(jù)
              def open(self):
                   #新的客戶端連接的時候,open()函數(shù)自動執(zhí)行胸完,
                   # 將接入的數(shù)據(jù)保存到集合中 add(self)
                   self.online_users.add(self)
                   # 向所有人發(fā)送消息书释,用戶誰連接上了
                   for user in self.online_users:
                        # 發(fā)送數(shù)據(jù) write_message()   獲取用戶IP self.request.remote_ip
                        user.write_message("[%s上線了]" % self.request.remote_ip)
    
              # 2.重寫on_message()函數(shù),獲取客戶端發(fā)送的消息并轉(zhuǎn)發(fā)給所有用戶
              def on_message(self, message):
                   # 函數(shù)on_message會自動接收客戶端發(fā)送的數(shù)據(jù)赊窥,數(shù)據(jù)包含在message變量中
                   # 向所有人發(fā)送消息爆惧,用戶誰說了什么
    
              # 重寫on_close()函數(shù),當斷開某個連接時锨能,移除在服務(wù)器記錄的數(shù)據(jù)
              def on_close(self):
                   # 當一個客戶端連接斷開時自動執(zhí)行的函數(shù)on_close()
                   #移除用戶數(shù)據(jù) remove(self)
                   self.online_users.remove(self)
                   # 向所有人發(fā)送消息扯再,用戶誰離開了
    
              # 允許跨域訪問,不然無法訪問
              def check_origin(self, origin):
                   return True
    
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末址遇,一起剝皮案震驚了整個濱河市熄阻,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌倔约,老刑警劉巖秃殉,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異浸剩,居然都是意外死亡钾军,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進店門绢要,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吏恭,“玉大人,你說我怎么就攤上這事重罪∮:撸” “怎么了哀九?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長唇礁。 經(jīng)常有香客問我勾栗,道長惨篱,這世上最難降的妖魔是什么盏筐? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮砸讳,結(jié)果婚禮上琢融,老公的妹妹穿的比我還像新娘。我一直安慰自己簿寂,他們只是感情好漾抬,可當我...
    茶點故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著常遂,像睡著了一般纳令。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上克胳,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天平绩,我揣著相機與錄音,去河邊找鬼漠另。 笑死捏雌,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的笆搓。 我是一名探鬼主播性湿,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼满败!你這毒婦竟也來了肤频?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤算墨,失蹤者是張志新(化名)和其女友劉穎宵荒,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體米同,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡骇扇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了面粮。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片少孝。...
    茶點故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖熬苍,靈堂內(nèi)的尸體忽然破棺而出稍走,到底是詐尸還是另有隱情袁翁,我是刑警寧澤,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布婿脸,位于F島的核電站粱胜,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏狐树。R本人自食惡果不足惜焙压,卻給世界環(huán)境...
    茶點故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望抑钟。 院中可真熱鬧涯曲,春花似錦、人聲如沸在塔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蛔溃。三九已至绰沥,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間贺待,已是汗流浹背徽曲。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留狠持,地道東北人疟位。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像喘垂,于是被迫代替她去往敵國和親甜刻。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,691評論 2 361

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理正勒,服務(wù)發(fā)現(xiàn)得院,斷路器,智...
    卡卡羅2017閱讀 134,713評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,312評論 25 707
  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 3,814評論 0 11
  • 我為什么要堅持每天300字的寫字訓練 提示章贞,這里說的是寫字訓練祥绞。因為相對于我寫的這些東西來說,如果參照百度百科的解...
    Jimuboy閱讀 982評論 0 0
  • 凌晨四點鸭限,處在北緯37度的這座西北小城還沉寂在一片黑夜之中蜕径。在一個不起眼的小院子里,一盞微弱的燈光打破了這...
    齊沐陽閱讀 255評論 0 1