flask是帶有session的,它加密後存儲在用戶瀏覽器的cookie中,能夠經過app.seesion_interface源碼查看html
from flask import Flask,session app = Flask(__name__) app.secret_key = 'aptx4869' # 必需要指定這個參數 @app.route('/login') def login(): #... # 設置session session['user_info'] = 'name' return '123' if __name__ == '__main__': app.run(debug=True)
登陸後,經過F12查看網絡請求信息,能夠看到一個Set-Cookie,這個cookie的key就是session,值爲一堆加密字符串前端
因爲服務端是單進程,單線程。全部請求過來時會排隊。這個字典會放一個key,這個key就是程序的線程id,value存放用戶信息web
它是一個協議,常與http對比,二者都是應用層協議。websocket主要解決了服務端向客戶端推送消息(全雙工)redis
http協議規定:一次請求一次響應,屬於無狀態短連接。http協議只能被動接受客戶端給服務端發送的消息數據庫
以前該介紹連接:猛戳此處django
websocket協議規定:flask
--握手:base64(sha1(key+magic key)) 瀏覽器
--收發數據(加密)websocket
-127cookie
-126
<=125
(通過以上三種字節大小判斷對數據進行解密)
--持久鏈接
在三大框架中的使用:
flask中使用了werkzurg,它支持websocket(在新版本中),可是效果不是太好,咱們可使用geventwebsocket模塊實現,它既支持http也支持websocket
django中默認socket使用的是wsgiref寫的,它也不支持websocket,只支持http協議,可是咱們可使用channel組件實現
tornado中默認使用的是本身的socket,它既支持http協議也支持websocket協議
相關博客連接
flask常見第三方組件
# Flask組件 flask-session session放在redis flask-SQLAlchemy 如django裏的ORM操做 flask-migrate 數據庫遷移 flask-script 自定義命令 blinker 信號-觸發信號 # 第三方組件 Wtforms 快速建立前端標籤、文本校驗 dbutile 建立數據庫鏈接池 gevnet-websocket 實現websocket # 自定義Flask組件 自定義auth認證 參考flask-login組件
flask上下文管理流程:
# a、簡單來講,falsk上下文管理能夠分爲三個階段: 一、'請求進來時':將請求相關的數據放入上下文管理中 二、'在視圖函數中':要去上下文管理中取值 三、'請求響應時':要將上下文管理中的數據清除 # b、詳細點來講: 一、'請求剛進來': 將request,session封裝在RequestContext類中 app,g封裝在AppContext類中 並經過LocalStack將requestcontext和appcontext放入Local類中 二、'視圖函數中': 經過localproxy--->偏函數--->localstack--->local取值 三、'請求響應時': 先執行save.session()再各自執行pop(),將local中的數據清除
主要涉及到類:
RequestContext #封裝進來的請求(賦值給ctx) AppContext #封裝app_ctx LocalStack #將local對象中的數據維護成一個棧(先進後出) Local #保存請求上下文對象和app上下文對象
Flask把Local對象中的的值stack 維護成一個列表緣由:
# 由於經過維護成列表,能夠實現一個棧的數據結構,進棧出棧時只取一個數據,巧妙的簡化了問題。 # 還有,在多app應用時,能夠實現數據隔離,列表裏不會加數據,而是會生成一個新的列表 # local是一個字典,字典裏key(stack)是惟一標識,value是一個列表
相關博客連接