国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Flask的session——關于寫擴展所學習到的

2019-11-14 17:07:54
字體:
來源:轉載
供稿:網友

這兩天端午節。趁著端午節沒事干,寫了個flask的擴展——flask-Redissession
在flask中使用該擴展可以讓你借助redis數據庫輕松獲得server-side session.
這個flask擴展可以使用pip install flask-redissession獲得,也可以進入flask-redissession給我個star 給我提問題/建議...

由于寫這個擴展包的需要,我重新研究了一下flask中session的部分。以下部分是我擴展包中的過程。

open_session

當用戶發送請求的時候,request被傳到服務器。由于使用的是server-side session,這個request中就包含一個sessionID。后臺程序調用open_session方法,來解析這個request,獲得session。具體的過程如下:

  1. 后臺程序解析request,通過session_cookie_name獲得sessionID(如果沒有,就設置為None)
  2. 檢驗這個sessionID是否存在。如果不存在,則生成一個sessionID,然后創建一個session,并返回給客戶端
  3. sessionID存在。檢驗是否使用SECRET_KEY來簽名。如果使用,則調用Signer函數生成Signer對象,并對這個sessionID進行unsigner操作。

    signer = Signer(app.secret_key, salt='flask-redis-session',                        key_derivation='hmac') sessionid = signer.unsign(sessionid).decode('utf-8')
  4. 根據unsigner操作獲得的結果在redis數據庫中查找對應的session(已序列化),并對session反序列化。如果根據sessionID沒找到,則創建一個新的session并返回給客戶端
  5. 把查找到的session返回給客戶端

save_session

如果session發生改變,就會調用這個方法(先刪除原session,再set_session)。
在save_session中,我們需要知道:

  1. 把session被序列化后的東西存入redis數據庫:
    以下是序列化的代碼

    serialize_session = self.serialization_method.dumps(dict(session))
  2. 需要在每次session發生改變的時候重置過期時間。
  3. 如果使用SECRET_KEY進行簽名,則在給用戶返回sessionID之前,需要對原sessionID進行簽名:

    session_id = Signer(app.secret_key, salt='flask-redis-session',                            key_derivation='hmac').sign(session.session_id.encode('utf-8'))#對session_id進行解碼,轉為strsession_id = session_id.decode('utf-8')
  4. 調用set_session為用戶設置新的session。其中傳輸的值為簽名后的sessionID

總結

  1. redis數據庫使用字符串對象存儲session。
    鍵:未簽名的sessionID
    值:序列化的session

  2. 用戶請求中(request)的sessionID是已簽名sessionID,在服務器中需要unsign操作才能獲得真正的sessionID
  3. 當session發生改變的時候,服務器需要在redis中刪除原session,并調用delete_cookie讓客戶端刪除這個session;然后向redis中寫入新的session(需要序列化),并通過調用set_session把簽名后的sessionID回傳給客戶端

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 南江县| 绿春县| 汉寿县| 黄石市| 石景山区| 平昌县| 黎城县| 道真| 侯马市| 玉树县| 宣化县| 齐齐哈尔市| 台北市| 泊头市| 九台市| 定州市| 县级市| 黑山县| 独山县| 自贡市| 海伦市| 渭南市| 鹰潭市| 阳城县| 巴彦县| 灌阳县| 长治市| 青阳县| 九寨沟县| 阜新市| 石楼县| 池州市| 凌源市| 元阳县| 溧阳市| 贺州市| 道真| 托克逊县| 新郑市| 若羌县| 长春市|