這兩天端午節。趁著端午節沒事干,寫了個flask的擴展——flask-Redissession
在flask中使用該擴展可以讓你借助redis數據庫輕松獲得server-side session.
這個flask擴展可以使用pip install flask-redissession獲得,也可以進入flask-redissession給我個star 給我提問題/建議...
由于寫這個擴展包的需要,我重新研究了一下flask中session的部分。以下部分是我擴展包中的過程。
當用戶發送請求的時候,request被傳到服務器。由于使用的是server-side session,這個request中就包含一個sessionID。后臺程序調用open_session方法,來解析這個request,獲得session。具體的過程如下:
session_cookie_name獲得sessionID(如果沒有,就設置為None)sessionID是否存在。如果不存在,則生成一個sessionID,然后創建一個session,并返回給客戶端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')把查找到的session返回給客戶端
如果session發生改變,就會調用這個方法(先刪除原session,再set_session)。
在save_session中,我們需要知道:
把session被序列化后的東西存入redis數據庫:
 以下是序列化的代碼
serialize_session = self.serialization_method.dumps(dict(session))如果使用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')調用set_session為用戶設置新的session。其中傳輸的值為簽名后的sessionID
delete_cookie讓客戶端刪除這個session;然后向redis中寫入新的session(需要序列化),并通過調用set_session把簽名后的sessionID回傳給客戶端新聞熱點
疑難解答