1. 程式人生 > >flask狀態保持

flask狀態保持

狀態保持

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

    • 無狀態:指一次使用者請求時,瀏覽器、伺服器無法知道之前這個使用者做過什麼,每次請求都是一次新的請求。
    • 無狀態原因:瀏覽器與伺服器是使用 socket 套接字進行通訊的,伺服器將請求結果返回給瀏覽器之後,會關閉當前的 socket 連線,而且伺服器也會在處理頁面完畢之後銷燬頁面物件。
    • 問題:有時需要保持下來使用者瀏覽的狀態。
  • 實現狀態保持主要有兩種方式:

    • 在客戶端儲存資訊使用Cookie
    • 在伺服器端儲存資訊使用Session

無狀態協議:

  1. 協議對於事務處理沒有記憶能力
  2. 對同一個 url 請求沒有上下文關係
  3. 每次的請求都是獨立的,它的執行情況和結果與前面的請求和之後的請求是無直接關係的,它不會受前面的請求應答情況直接影響,也不會直接影響後面的請求應答情況
  4. 伺服器中沒有儲存客戶端的狀態,客戶端必須每次帶上自己的狀態去請求伺服器
  5. 人生若只如初見

Cookie

  • Cookie:指某些網站為了辨別使用者身份、進行會話跟蹤而儲存在使用者本地的資料(通常經過加密)。

    • 複數形式Cookies。
    • Cookie最早是網景公司的前僱員Lou Montulli在1993年3月的發明。
    • Cookie是由伺服器端生成,傳送給客戶端瀏覽器,瀏覽器會將Cookie的key/value儲存,下次請求同一網站時就傳送該Cookie給伺服器(前提是瀏覽器設定為啟用cookie)。

設定cookie

  • Cookie的key/value可以由伺服器端自己定義。

  • 應用:判定註冊使用者是否已經登入網站、廣告推送、購物車

  • 注意:

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

    • Cookie基於域名安全,不同域名的Cookie是不能互相訪問的
      <瀏覽器同源策略>

    • 如訪問itcast.cn時向瀏覽器中寫了Cookie資訊,使用同一瀏覽器訪問baidu.com時,無法訪問到itcast.cn寫的Cookie資訊

    • 當瀏覽器請求某網站時,會將本網站下所有Cookie資訊提交給伺服器,所以在request中可以讀取Cookie資訊

from flask imoprt Flask,make_response
@app.route('/cookie')
def set_cookie():
    resp = make_response('this is to set cookie')
    resp.set_cookie('username', 'itcast')
    return resp
  • 設定過期時間
@app.route('/cookie')
def set_cookie():
    response = make_response('hello world')
    response.set_cookie('username', 'itheima', max_age=3600)
    return response

獲取cookie

from flask import Flask,request
#獲取cookie
@app.route('/request')
def resp_cookie():
    resp = request.cookies.get('username')
    return resp

Session

  • 對於敏感、重要的資訊,建議要儲存在伺服器端,不能儲存在瀏覽器中,如使用者名稱、餘額、等級、驗證碼等資訊
  • 在伺服器端進行狀態保持的方案就是Session
  • Session依賴於Cookie

session資料的獲取

session:請求上下文物件,用於處理http請求中的一些資料內容

@app.route('/index1')
def index1():
    session['username'] = 'itcast'
    return redirect(url_for('index'))
@app.route('/')
def index():
    return session.get('username')

必須設定secret_key: app.secret_key = ‘ipython’ secret_key的作用:https://segmentfault.com/q/1010000007295395