flask學習之 會話控制
會話控制
所謂的會話,就是使用者和瀏覽器中網站之間一次互動過程.
會話的開始是在使用者開啟瀏覽器以後第一次訪問網站.
會話的結束時在使用者關閉瀏覽器以後.
因為 http 是一種無狀態協議,瀏覽器請求伺服器是無狀態的。
無狀態:指一次使用者請求時,瀏覽器、伺服器無法知道之前這個使用者做過什麼,每次請求都是一次新的請求。
無狀態原因:瀏覽器與伺服器是使用 socket 套接字進行通訊的,伺服器將請求結果返回給瀏覽器之後,會關閉當前的 socket 連線,而且伺服器也會在處理頁面完畢之後銷燬頁面物件。
有時需要保持下來使用者瀏覽的狀態,比如使用者是否登入過,瀏覽過哪些商品等
實現狀態保持主要有兩種方式:
在客戶端儲存資訊使用`Cookie,本地儲存,token[jwt,oauth]`
在伺服器端儲存資訊使用`Session`,redis
一.Cookie
Cookie是由伺服器端生成,傳送給客戶端瀏覽器,瀏覽器會將Cookie的key/value儲存,下次請求同一網站時就傳送該Cookie給伺服器(前提是瀏覽器設定為啟用cookie)。Cookie的key/value可以由伺服器端自己定義。
使用場景: 登入狀態, 瀏覽歷史, 網站足跡,購物車 [不登入也可以使用購物車]
Cookie是儲存在瀏覽器中的一段純文字資訊,建議不要儲存敏感資訊如密碼,因為電腦上的瀏覽器可能被其它人使用
Cookie基於域名安全,不同域名的
如訪問baidu.com時向瀏覽器中寫了Cookie資訊,使用同一瀏覽器訪問souhu.com時,無法訪問到baidu.com寫的Cookie資訊
瀏覽器的同源策略針對cookie也有限制作用.
當瀏覽器請求某網站時,會將本網站下所有Cookie資訊提交給伺服器,所以在request中可以讀取Cookie資訊。
1.設定cookie
設定cookie需要通過flask的Response響應物件來進行設定,由flask內部提供了一個make_response函式給我們可以快速建立響應物件
from flask import Flask, make_response app= Flask(__name__) @app.route("/set_cookie") def cookie_demo(): response = make_response("make a cookie") # response.set_cookie("變數名", "變數值", max_age="有效期幾秒") response.set_cookie("username", "zero", max_age=20) return response if __name__ == '__main__': app.run(port=5000, host='0.0.0.0', debug=True)
2.獲取cookie
from flask import Flask from flask import request app = Flask(__name__) @app.route('/get_cookie') def resp_cookie(): resp = request.cookies.get('username') return resp if __name__ == '__main__': app.run(port=5000, host='0.0.0.0', debug=True) 需要先set cookie 再進行get cookie
注意:
如果沒有先生產cookie,直接獲取會報錯。
二.Session
對於敏感、重要的資訊,建議要儲存在伺服器端,不能儲存在瀏覽器中,如使用者名稱、餘額、等級、驗證碼等資訊
在伺服器端進行狀態保持的方案就是`Session`
注意: **Session依賴於Cookie**,而且flask中使用session,需要配置SECRET_KEY選項,否則報錯.
1.設定session
rom flask import Flask from flask import session app = Flask(__name__) # 宣告一個配置類 class Config(object): SECRET_KEY = "DD434O7HQ2131!@#edn#hu!@!g@uWO1NS" # 載入配置 app.config.from_object(Config) @app.route('/set_session') def set_session(): session['username'] = 'one' return 'set session ok!' @app.route('/get_session') def get_session(): return session.get('username') if __name__ == '__main__': app.run(port=5000, host='127.0.0.1', debug=True)
2.獲取session
刪除一個session設定值為None,修改一個session重新賦值即可。