1. 程式人生 > 實用技巧 >flask學習之 會話控制

flask學習之 會話控制

會話控制

所謂的會話,就是使用者和瀏覽器中網站之間一次互動過程.

會話的開始是在使用者開啟瀏覽器以後第一次訪問網站.

會話的結束時在使用者關閉瀏覽器以後.

因為 http 是一種無狀態協議,瀏覽器請求伺服器是無狀態的。

無狀態:指一次使用者請求時,瀏覽器、伺服器無法知道之前這個使用者做過什麼,每次請求都是一次新的請求。

無狀態原因:瀏覽器與伺服器是使用 socket 套接字進行通訊的,伺服器將請求結果返回給瀏覽器之後,會關閉當前的 socket 連線,而且伺服器也會在處理頁面完畢之後銷燬頁面物件。

有時需要保持下來使用者瀏覽的狀態,比如使用者是否登入過,瀏覽過哪些商品等

實現狀態保持主要有兩種方式:

在客戶端儲存資訊使用`Cookie,本地儲存,token[jwt,oauth]`

在伺服器端儲存資訊使用`Session`,redis

一.Cookie

Cookie是由伺服器端生成,傳送給客戶端瀏覽器,瀏覽器會將Cookiekey/value儲存,下次請求同一網站時就傳送該Cookie給伺服器(前提是瀏覽器設定為啟用cookie)。Cookiekey/value可以由伺服器端自己定義。

使用場景: 登入狀態, 瀏覽歷史, 網站足跡,購物車 [不登入也可以使用購物車]

Cookie是儲存在瀏覽器中的一段純文字資訊,建議不要儲存敏感資訊如密碼,因為電腦上的瀏覽器可能被其它人使用

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重新賦值即可。