flask基礎之請求鈎子(十二)


前言

什么是請求鈎子?在客戶端和服務器交互的過程中,有些准備工作或掃尾工作需要統一處理,為了讓每個視圖函數避免編寫重復功能的代碼,flask提供了統一的接口可以添加這些處理函數,即請求鈎子。

請求鈎子的原理

先回顧一下flask對請求的處理流程:

接收請求--》創建請求上下文--》請求上下文入棧--》創建該請求的應用上下文--》應用上下文入棧--》處理邏輯--》請求上下文出棧--》應用上下文出棧

看了這個過程,flask放置請求鈎子的位置有:處理邏輯之前,處理邏輯之后,應用上下文出棧之前。

flask有五種常用請求鈎子:

  • before_first_request:在處理app第一個請求前運行。

  • before_request:在每次請求前運行。

  • after_request:如果處理邏輯沒有異常拋出,在每次請求后運行。

  • teardown_request:在每次請求后運行,即使處理發生了錯誤。

  • teardown_appcontext:在應用上下文從棧中彈出之前運行

定義請求鈎子

# before_request裝飾的方法會加載到app的before_request_funcs列表中,按加載的順序依次執行,不需要參數
@app.before_request
def rest_test():
    print('this is a test'+ '--2')
    pass

# before_first_request裝飾的函數加載到before_first_request_funcs列表中,只不過在app第一次接收到請求后執行,其他時候不再執行
@app.before_first_request
def app_first_request():
    print('first_request' + '--1')

# after_request裝飾的函數加載到after_request_funcs列表中,傳入的參數是response對象,可以對其進行攔截修改,必須返回一個response對象
@app.after_request
def after_request(rsp):
    print(rsp)
    print('--3')
    return rsp

# teardown_request裝飾的函數加載到teardown_request_funcs中,如果發生了異常則傳入error的對象,無異常參數為None,無返回值
@app.teardown_request
def teardown_request(error):
    print(error)
    print('--4')

# teardown_appcontext裝飾的函數加載到teardown_appcontext_funcs中,如果發生了異常則傳入error的對象,無異常參數為None,無返回值
@app.teardown_appcontext
def teardown_appcontext(error):
    print('--5')

注意

  • 在debug模式下,teardown_request和teardown_appcontext裝飾的函數不會執行;

  • after_request請求鈎子會自動傳入response對象作為參數,同時必須返回一個response對象;

  • before_request裝飾的函數不需要返回數據,如果返回了數據,那么視圖函數不會再執行,而是直接返回結果。

藍圖的請求鈎子

藍圖存在的目的是為了在大型應用中對眾多的業務模塊的api分層次管理,所以即使在主app下定義的路由規則,其默認是在None為名字的藍圖下面的,所以藍圖也有自己的請求鈎子,只在該藍圖下的api其作用。

from flask import Blueprint

testblue = Blueprint('blue', __name__)

# 藍圖也可以為主app添加請求鈎子,before_app_first_request裝飾會在app的before_first_request_funcs列表中,以None為鍵;
@testblue.before_app_first_request
def app_first_request():
    print('first_request' + '--1')

# 加載到app的before_request_funcs列表中,在None藍圖下,按加載的順序依次執行,不需要參數
@testblue.before_app_request
def app_request():
    pass

# 加載到app的before_request_funcs列表中,在testblue藍圖下
@testblue.before_request
def blue_before_request():
    pass

# 加載到after_request_funcs列表中,在testblue藍圖下
@testblue.after_request
def after_request(rsp):
    return rsp

# 加載到after_request_funcs列表中,在None藍圖下
@testblue.after_app_request
def blue_after_app_request(rsp):
    return rsp

#teardown_request裝飾的函數加載到app的teardown_request_funcs中,在testblue藍圖下
@testblue.teardown_request
def teardown_request(error):
    print(error)
    print('--4')

# 和teardown_request功能一樣,在None藍圖下
@testblue.teardown_app_request
def blue_teardown_app_request(error):
    pass

注意

  • teardown_request裝飾的函數無論有沒有異常都執行,after_request裝飾的函數無異常才執行。

  • 對於before_request、after_request、teardown_request請求鈎子,如果app存在相應的請求鈎子函數,則藍圖和app的請求鈎子函數都會執行,先執行app的鈎子函數,再執行藍圖的鈎子函數。

參考


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM