flask总结之session,websocket,上下文管理
1.關(guān)于session
flask是帶有session的,它加密后存儲(chǔ)在用戶瀏覽器的cookie中,可以通過app.seesion_interface源碼查看
from flask import Flask,sessionapp = Flask(__name__) app.secret_key = 'aptx4869' # 必須要指定這個(gè)參數(shù) @app.route('/login') def login():#...# 設(shè)置sessionsession['user_info'] = 'name'return '123'if __name__ == '__main__':app.run(debug=True) View Code登錄后,通過F12查看網(wǎng)絡(luò)請(qǐng)求信息,可以看到一個(gè)Set-Cookie,這個(gè)cookie的key就是session,值為一堆加密字符串
由于服務(wù)端是單進(jìn)程,單線程。所有請(qǐng)求過來時(shí)會(huì)排隊(duì)。這個(gè)字典會(huì)放一個(gè)key,這個(gè)key就是程序的線程id,value存放用戶信息
2.關(guān)于websocket
它是一個(gè)協(xié)議,常與http對(duì)比,兩者都是應(yīng)用層協(xié)議。websocket主要解決了服務(wù)端向客戶端推送消息(全雙工)
http協(xié)議規(guī)定:一次請(qǐng)求一次響應(yīng),屬于無狀態(tài)短鏈接。http協(xié)議只能被動(dòng)接受客戶端給服務(wù)端發(fā)送的消息
之前該介紹鏈接:猛戳此處
websocket協(xié)議規(guī)定:
--握手:base64(sha1(key magic key))
--收發(fā)數(shù)據(jù)(加密)
-127
-126
<=125
(經(jīng)過以上三種字節(jié)大小判斷對(duì)數(shù)據(jù)進(jìn)行解密)
--持久連接
在三大框架中的使用:
? flask中使用了werkzurg,它支持websocket(在新版本中),但是效果不是太好,我們可以使用geventwebsocket模塊實(shí)現(xiàn),它既支持http也支持websocket
django中默認(rèn)socket使用的是wsgiref寫的,它也不支持websocket,只支持http協(xié)議,但是我們可以使用channel組件實(shí)現(xiàn)
tornado中默認(rèn)使用的是自己的socket,它既支持http協(xié)議也支持websocket協(xié)議
相關(guān)博客鏈接
3.上下文管理
flask常見第三方組件
# Flask組件flask-session session放在redisflask-SQLAlchemy 如django里的ORM操作flask-migrate 數(shù)據(jù)庫(kù)遷移flask-script 自定義命令blinker 信號(hào)-觸發(fā)信號(hào) # 第三方組件 Wtforms 快速創(chuàng)建前端標(biāo)簽、文本校驗(yàn)dbutile 創(chuàng)建數(shù)據(jù)庫(kù)連接池gevnet-websocket 實(shí)現(xiàn)websocket # 自定義Flask組件 自定義auth認(rèn)證 參考flask-login組件flask上下文管理流程:
# a、簡(jiǎn)單來說,falsk上下文管理可以分為三個(gè)階段:1、'請(qǐng)求進(jìn)來時(shí)':將請(qǐng)求相關(guān)的數(shù)據(jù)放入上下文管理中2、'在視圖函數(shù)中':要去上下文管理中取值3、'請(qǐng)求響應(yīng)時(shí)':要將上下文管理中的數(shù)據(jù)清除 # b、詳細(xì)點(diǎn)來說:1、'請(qǐng)求剛進(jìn)來':將request,session封裝在RequestContext類中app,g封裝在AppContext類中并通過LocalStack將requestcontext和appcontext放入Local類中2、'視圖函數(shù)中':通過localproxy--->偏函數(shù)--->localstack--->local取值3、'請(qǐng)求響應(yīng)時(shí)':先執(zhí)行save.session()再各自執(zhí)行pop(),將local中的數(shù)據(jù)清除主要涉及到類:
RequestContext #封裝進(jìn)來的請(qǐng)求(賦值給ctx) AppContext #封裝app_ctx LocalStack #將local對(duì)象中的數(shù)據(jù)維護(hù)成一個(gè)棧(先進(jìn)后出) Local #保存請(qǐng)求上下文對(duì)象和app上下文對(duì)象Flask把Local對(duì)象中的的值stack 維護(hù)成一個(gè)列表原因:
# 因?yàn)橥ㄟ^維護(hù)成列表,可以實(shí)現(xiàn)一個(gè)棧的數(shù)據(jù)結(jié)構(gòu),進(jìn)棧出棧時(shí)只取一個(gè)數(shù)據(jù),巧妙的簡(jiǎn)化了問題。 # 還有,在多app應(yīng)用時(shí),可以實(shí)現(xiàn)數(shù)據(jù)隔離,列表里不會(huì)加數(shù)據(jù),而是會(huì)生成一個(gè)新的列表 # local是一個(gè)字典,字典里key(stack)是唯一標(biāo)識(shí),value是一個(gè)列表?
相關(guān)博客鏈接
更多專業(yè)前端知識(shí),請(qǐng)上 【猿2048】www.mk2048.com
總結(jié)
以上是生活随笔為你收集整理的flask总结之session,websocket,上下文管理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 理解正则
- 下一篇: django中间件及中间件实现的登录验证