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

flask中的狀態保持

什麼是狀態保持

定義記錄使用者訪問狀態一種機制。例如:使用者是否登陸過,使用者的搜尋記錄

  • 因為 http 是一種無狀態協議,瀏覽器請求伺服器是無狀態的。
  • 無狀態:指一次使用者請求時,瀏覽器、伺服器無法知道之前這個使用者做過什麼,每次請求都是一次新的請求。
  • 無狀態原因:瀏覽器與伺服器是使用socket 套接字進行通訊的,伺服器將請求結果返回給瀏覽器之後,會關閉當前的 socket連線,而且伺服器也會在處理頁面完畢之後銷燬頁面物件。 有時需要保持下來使用者瀏覽的狀態,比如使用者是否登入過,瀏覽過哪些商品等
  • 實現狀態保持主要有兩種方式: 在客戶端儲存資訊使用Cookie 在伺服器端儲存資訊使用Session

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

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

應用:

  • 最典型的應用是判定註冊使用者是否已經登入網站,使用者可能會得到提示,是否在下一次進入此網站時保留使用者資訊以便簡化登入手續,這些都是Cookie的功用。
  • 網站的廣告推送,經常遇到訪問某個網站時,會彈出小視窗,展示我們曾經在購物網站上看過的商品資訊。
  • 購物車,使用者可能會在一段時間內在同一家網站的不同頁面中選擇不同的商品,這些資訊都會寫入Cookie,以便在最後付款時提取資訊。

提示:

  • Cookie是儲存在瀏覽器中的一段純文字資訊,建議不要儲存敏感資訊如密碼,因為電腦上的瀏覽器可能被其它人使用
  • Cookie基於域名安全,不同域名的Cookie是不能互相訪問的
    • 如訪問itcast.cn時向瀏覽器中寫了Cookie資訊,使用同一瀏覽器訪問baidu.com時,無法訪問到itcast.cn寫的Cookie資訊
    • 瀏覽器的同源策略
  • 當瀏覽器請求某網站時,會將本網站下所有Cookie資訊提交給伺服器,所以在request中可以讀取Cookie資訊

程式碼實現

	from flask import Flask, make_response, request
	
	app = Flask(__name__)
	
	@app.route("/")
	def index():
	    isHelp = request.cookies.get('isHelp')
	    if isHelp:
	        return 'index page is show'
	    
	    # 自定義響應物件
	    response = make_response('Help page is show')
	    # 設定cookie及cookie過期時間3600s
	    response.set_cookie('isHelp', 'python', max_age=3600)
	
	    return response
	
	if __name__ == '__main__':
	    app.run(debug=True)

session:對於敏感、重要的資訊,建議要儲存在伺服器端,不能儲存在瀏覽器中,如使用者名稱、餘額、等級、驗證碼等資訊

免密碼登陸
	from flask import Flask, request, session, redirect, url_for
	
	app = Flask(__name__)
	# 設定祕鑰,隨機字串
	app.secret_key = 'bMNznSI1Kt/c6+05oIfk/+p81SbOJ2EAGILo/VJbySwmawOeD0HQ2dmyRs0xRQ=='
	
	
	@app.route("/")
	def index():
	    # 獲取session中的使用者資訊,如果沒有就是None
	    username = session.get('username')
	    print(username)
	
	    if username:
	        return '歡迎回來%s' % username
	
	    return redirect(url_for('login'))
	
	
	@app.route('/login', methods=['GET', 'POST'])
	def login():
	    # 如果是GET請求方式
	    if request.method == 'GET':
	        with open('login.html') as f:
	            content = f.read()
	            return content
	    # 獲取資料
	    username = request.form.get('username')
	    password = request.form.get('password')
	    print(type(password))
	    # 如果是post請求方式
	    # 判斷賬號密碼是否正確
	    if username == 'zs' and password == '123':
	        # 儲存賬號密碼,記錄使用者的登陸狀態
	        session['username'] = username
	        session['password'] = password
	
	        # 跳轉到首頁
	        return redirect(url_for('index'))
	
	    else:
	        return '登陸失敗'
	
	
	if __name__ == '__main__':
	    app.run(debug=True)