1. 程式人生 > >Flask——請求鉤子/狀態保持

Flask——請求鉤子/狀態保持

請求鉤子

為什麼要有這個請求鉤子出現呢?
在客戶端和服務端的資料互動的過程中,有些準備工作或掃尾工作需要處理,比如
	在請求開始時,建立資料庫連線;
	在請求開始時,根據需求進行許可權校驗;
	在請求結束時,指定資料的互動格式;
	為了讓每個檢視函式避免編寫同樣的程式碼,Flask提供了通用設施的功能,即請求鉤子。
	請求鉤子是通過裝飾器實現的,Flask支援如下四種請求鉤子:
		before_first_request(在處理第一個請求前執行)
		brdore_request(在每次請求前執行,如果在某修飾函式中返回了一個響應,檢視函式將不再被呼叫)
		after_request(如果沒有丟擲異常,在每次請求後執行;接受一個引數:檢視函式做出的響應(response);在此函式中可以對響應值在返回之前進行進一步的修改;需要將引數中的響應在此函式中返回)
		teardown_request(在每次請求後執行;接收一個引數:錯誤資訊(e)同errorhandler,如果有相關異常丟擲)
		注意:這個異常是指程式碼本身錯誤(程式碼中出現10/0)不執行,如果abort丟擲異常了,after_request還是會執行。

狀態保持

因為http是一種無狀態的協議,基於套接字(socket),瀏覽器請求伺服器是無狀態的。無狀態:就是指一次使用者請求之後,瀏覽器伺服器無法知道這個使用者做過什麼,每次請求都是一次新的請求。但是,我們在實際的開發過程中,需要記錄使用者是否登陸過,以及瀏覽過那些商品之類的需求。
	實現狀態保持有兩種方式:
		在客戶端儲存資訊使用Cookie;
		在伺服器端儲存資訊使用Session;
	兩種都是基於鍵值對的字串,伺服器生成Cookie資訊,都儲存在瀏覽器當這個。而伺服器生成Session資訊,key儲存在瀏覽器中,value儲存在伺服器中。

Cookie設定和獲取:

	from flask import Flask,make_response,request
	
	app = Flask(__name__)
	
	# Cookie有一個同源策略,百度給的京東拿不到。 
	# 設定Cookie
	@app.route('/')
	def index():
	    response = make_response('set cookie success')
	    # 設定Cookie,設定有效期,單位是秒。
	    response.set_cookie('name','wax',max_age = 360)
	    # 返回響應
	    return response
	# 在瀏覽器的set_cookie:name = wax,path = /    這個路徑path就是瀏覽器的這個cookie允許的域
	# 獲取Cookie
	@app.route('/get')
	def get_cookie():
	    name  = request.cookies.get('name')
	    return name

	if __name__ == '__main__':
	    app.run()

Session的設定和獲取

	from flask import Flask,session
	
	app = Flask(__name__)
	# 設定金鑰
	app.config['SECRET_KEY'] = 's9H/oDtK/s5gbddabV2aMjFb4AHrbNwR7nRl7y4WvDmZwDHdAFRsHw=='
	
	# 設定Session,設定session要求會話安全。需要設定一個金鑰。
	@app.route('/')
	def set_session():
	    session['name'] = 'wax'
	    return 'set session success'
	
	
	if __name__ == '__main__':
	    app.run()

	設定session的時候如何選擇一個合適的金鑰,如何去尋找這個合適的安全的字串呢,使用base64這個編碼工具:
	import os,base64
	a = os.urandom(40)
	base64.b64encode(a)