關于 flask_session 在登錄時設置后,再其他接口獲取時為None的問題
flask本身的session對于生產來講可能并不能滿足我們,我們需要使用三方插件來滿足我們的生產環境。
一般情況下,session對應的存儲值我們需要持久化到數據庫中,所以我們的session將會啟用flask三方插件:flask_session
配置flask_session 由于每個項目的不同我的配置未必符合你的項目,你可以直接查看flask_session的官方文檔: Usage - Flask-Session 0.8.0 documentation
在settings里面的配置
SESSION_TYPE = "redis" SESSION_REDIS = Redis( host=REDIS_HOST, port=REDIS_PORT, password=REDIS_PASSWORD, db=REDIS_RESULTS_DB ) # type: ignore PERMANENT_SESSION_LIFETIME = dt.timedelta(minutes=5) SESSION_COOKIE_DOMAIN = "*"
然后創建工廠函數等,以下是項目配置,我們可能并不相同
from flask_session import Session session = Session()
from xxx.extensions import session session.init_app(self.flask_app)
創建好后,我們在項目上使用一下
class Captcha(MethodView): def get(self): session["b64_str"] = “text” return json_response(data=b64_str) class Captcha111(MethodView): def get(self): text = session.get("b64_str") print(text) return json_response(data=text)
當我們在調用captcha111的時候,你會發現session所get出來的數據是None。
這不符合我們對session的期望,這時我們需要知道為什么會發生這種事。
解決問題的思路。
首先你需要知道,會不會是我們的redis數據庫的問題,我們先驗證數據是否是沒問題的。
我們把settings里面的數據庫連接中,密碼修改為錯誤密碼,當我們調用captch路由時,會拋出redis連接異常的錯誤,說明我們的redis連接是沒問題的,一般情況下,里面所存儲的數據就也是沒問題的,我們應該這種自信,斷定redis是沒問題的。
既然redis是沒問題的,那就看在第二個路由里面獲取時,走沒走redis數據庫,初步考慮應該是沒有的,不然不會取不出來,我們可以采取剛才的方式,將數據庫的密碼修改為錯誤,然后在調用獲取的方法,發現并未出現數據庫連接報錯,可見,當前的session在獲取數據時,并未連接數據庫,這就可以側面印證,在某一時刻,我們的session和上次的session并非是同一個session,哪怕這個session的id是相同的id。
這時,我們就需要知道flask_session的運行原理,否則我們無法得知它在哪個環節被限制住了:flask學習筆記--flask內置session處理機制_flask session httponly-CSDN博客
當我們得知它會在

這里進行相應的攔截時,我們可以考慮是不是因為我們使用postman二次訪問未攜帶相應的cookie導致的。
理論成立,實踐動手:
我們使用瀏覽器訪問后,取得cookie:

然后取出cookie后,我們是用postman發起訪問:

果然,data的數據出現,說明我們的想法是沒問題的。
那么問題回到剛才,我們此時的session.get會訪問redis數據庫嗎?
答案是:會的。隨后我便驗證了,當密碼不正確時,代碼執行到此處時會拋出數據庫未連接的異常信息。
最后,當你想讓它出現在cookie,以便前端直接訪問時:

你可以這樣寫:
class Captcha(MethodView): __doc__ = """獲取圖片驗證碼""" def get(self): from flask import Response b64_str, text = generate_captcha() session["b64_str"] = text response = json_response(code=CODE.OK.code, data=b64_str) response.set_cookie("session", session.sid) return response
浙公網安備 33010602011771號