flask總結之session,websocket,上下文管理

1.關於session

  flask是帶有session的,它加密後存儲在用戶瀏覽器的cookie中,可以通過app.seesion_interface源碼查看

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)
View Code

登錄後,通過F12查看網絡請求信息,可以看到一個Set-Cookie,這個cookie的key就是session,值爲一堆加密字符串

由於服務端是單進程,單線程。所有請求過來時會排隊。這個字典會放一個key,這個key就是程序的線程id,value存放用戶信息

2.關於websocket

  它是一個協議,常與http對比,兩者都是應用層協議。websocket主要解決了服務端向客戶端推送消息(全雙工)

  http協議規定:一次請求一次響應,屬於無狀態短鏈接。http協議只能被動接受客戶端給服務端發送的消息

  之前該介紹鏈接:猛戳此處

  websocket協議規定:

    --握手:base64(sha1(key+magic key))  

    --收發數據(加密)

       -127

       -126

       <=125

      (經過以上三種字節大小判斷對數據進行解密)

    --持久連接

  在三大框架中的使用:

     flask中使用了werkzurg,它支持websocket(在新版本中),但是效果不是太好,我們可以使用geventwebsocket模塊實現,它既支持http也支持websocket

    django中默認socket使用的是wsgiref寫的,它也不支持websocket,只支持http協議,但是我們可以使用channel組件實現

    tornado中默認使用的是自己的socket,它既支持http協議也支持websocket協議

相關博客鏈接

3.上下文管理

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上下文管理可以分爲三個階段:
  1、'請求進來時':將請求相關的數據放入上下文管理中
  2、'在視圖函數中':要去上下文管理中取值
  3、'請求響應時':要將上下文管理中的數據清除
# b、詳細點來說:
  1、'請求剛進來':
        將request,session封裝在RequestContext類中
        app,g封裝在AppContext類中
        並通過LocalStack將requestcontext和appcontext放入Local類中
  2、'視圖函數中':
        通過localproxy--->偏函數--->localstack--->local取值
  3、'請求響應時':
        先執行save.session()再各自執行pop(),將local中的數據清除

主要涉及到類:

RequestContext  #封裝進來的請求(賦值給ctx)
AppContext      #封裝app_ctx
LocalStack      #將local對象中的數據維護成一個棧(先進後出)
Local           #保存請求上下文對象和app上下文對象

Flask把Local對象中的的值stack 維護成一個列表原因:

# 因爲通過維護成列表,可以實現一個棧的數據結構,進棧出棧時只取一個數據,巧妙的簡化了問題。
# 還有,在多app應用時,可以實現數據隔離,列表裏不會加數據,而是會生成一個新的列表
# local是一個字典,字典裏key(stack)是唯一標識,value是一個列表

 

相關博客鏈接

  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章