Flask 請求鉤子 hook
在客戶端和伺服器互動的過程中,有些準備工作或掃尾工作需要處理,比如:
-
在專案執行開始時,建立資料庫連線;
-
在客戶端請求開始時,根據需求進行許可權校驗;
-
在請求結束檢視返回資料時,指定資料的互動格式;
為了讓每個檢視函式避免編寫重複功能的程式碼,Flask提供了通用設定的功能,即請求鉤子。
請求鉤子是通過裝飾器的形式實現,Flask支援如下四種請求鉤子(注意:名字是固定):
-
-
在處理第一個請求前執行[專案初始化時的鉤子]
-
-
before_request
-
在每一次請求前執行
-
如果在某修飾的函式中返回了一個響應,檢視函式將不再被呼叫
-
-
after_request
-
如果沒有丟擲錯誤,在每次請求後執行
-
接受一個引數:檢視函式作出的響應
-
在此函式中可以對響應值在返回之前做最後一步修改處理
-
需要將引數中的響應在此引數中進行返回
-
-
teardown_request:
-
在每一次請求後執行
-
接受一個引數:錯誤資訊,如果有相關錯誤丟擲
-
需要設定flask的配置DEBUG=False,teardown_request才會接受到異常物件。
示例程式碼:
from flask import Flask,request # 初始化 app = Flask(import_name=__name__) # 宣告和載入配置 class Config(): DEBUG = True app.config.from_object(Config) @app.before_first_request def before_first_request(): """ 這個鉤子會在專案啟動後第一次被使用者訪問時執行 可以編寫一些初始化專案的程式碼,例如,資料庫初始化,載入一些可以延後引入的全域性配置 """ print("----before_first_request----") print("系統初始化的時候,執行這個鉤子方法")print("會在接收到第一個客戶端請求時,執行這裡的程式碼") @app.before_request def before_request(): """ 這個鉤子會在每次客戶端訪問檢視的時候執行 # 可以在請求之前進行使用者的身份識別,以及對於本次訪問的使用者許可權等進行判斷。.. """ print("----before_request----") print("每一次接收到客戶端請求時,執行這個鉤子方法") print("一般可以用來判斷許可權,或者轉換路由引數或者預處理客戶端請求的資料") @app.after_request def after_request(response): print("----after_request----") print("在處理請求以後,執行這個鉤子方法") print("一般可以用於記錄會員/管理員的操作歷史,瀏覽歷史,清理收尾的工作") response.headers["Content-Type"] = "application/json" response.headers["Company"] = "python oldboy..." # 必須返回response引數 return response @app.teardown_request def teardown_request(exc): print("----teardown_request----") print("在每一次請求以後,執行這個鉤子方法") print("如果有異常錯誤,則會傳遞錯誤異常物件到當前方法的引數中") # 在專案關閉了DEBUG模式以後,則異常資訊就會被傳遞到exc中,我們可以記錄異常資訊到日誌檔案中 print(exc) # 編寫路由檢視 @app.route(rule='/') def index(): print("-----------檢視函式執行了---------------") return "<h1>hello world!</h1>" if __name__ == '__main__': # 執行flask app.run(host="0.0.0.0")
## 第一次請求列印結果:
----before_first_request----
系統初始化的時候,執行這個鉤子方法
會在接收到第一個客戶端請求時,執行這裡的程式碼
----before_request----
127.0.0.1 - - [04/Aug/2020 14:40:22] "GET / HTTP/1.1" 200 -
每一次接收到客戶端請求時,執行這個鉤子方法
一般可以用來判斷許可權,或者轉換路由引數或者預處理客戶端請求的資料
-----------檢視函式執行了---------------
----after_request----
在處理請求以後,執行這個鉤子方法
一般可以用於記錄會員/管理員的操作歷史,瀏覽歷史,清理收尾的工作
----teardown_request----
在每一次請求以後,執行這個鉤子方法
如果有異常錯誤,則會傳遞錯誤異常物件到當前方法的引數中
None
第二次請求列印結果:
----before_request----
每一次接收到客戶端請求時,執行這個鉤子方法
一般可以用來判斷許可權,或者轉換路由引數或者預處理客戶端請求的資料
127.0.0.1 - - [04/Aug/2020 14:40:49] "GET / HTTP/1.1" 200 -
-----------檢視函式執行了---------------
----after_request----
在處理請求以後,執行這個鉤子方法
一般可以用於記錄會員/管理員的操作歷史,瀏覽歷史,清理收尾的工作
----teardown_request----
在每一次請求以後,執行這個鉤子方法
如果有異常錯誤,則會傳遞錯誤異常物件到當前方法的引數中
None