1. 程式人生 > 其它 >Flask 請求鉤子 hook

Flask 請求鉤子 hook

在客戶端和伺服器互動的過程中,有些準備工作或掃尾工作需要處理,比如:

  • 在專案執行開始時,建立資料庫連線;

  • 在客戶端請求開始時,根據需求進行許可權校驗;

  • 在請求結束檢視返回資料時,指定資料的互動格式;

為了讓每個檢視函式避免編寫重複功能的程式碼,Flask提供了通用設定的功能,即請求鉤子。

請求鉤子是通過裝飾器的形式實現,Flask支援如下四種請求鉤子(注意:名字是固定):

  • before_first_request

    • 在處理第一個請求前執行[專案初始化時的鉤子]

  • 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