延遲請求回呼

Flask 的設計原則之一是,回應物件會被建立並傳遞到一連串可能修改或替換它們的回呼函數中。當請求處理開始時,還沒有回應物件。它會在需要時由視圖函數或系統中的其他組件建立。

如果您想在回應尚不存在時修改回應,該怎麼辦?一個常見的例子是 before_request() 回呼函數想要在回應物件上設定 cookie。

一種方法是避免這種情況。通常這是可能的。例如,您可以嘗試將該邏輯移到 after_request() 回呼函數中。然而,有時將程式碼移到那裡會使推理變得更複雜或笨拙。

作為替代方案,您可以使用 after_this_request() 來註冊僅在當前請求之後執行的回呼函數。這樣,您可以根據當前請求,從應用程式中的任何位置延遲程式碼執行。

在請求期間的任何時間,我們都可以註冊一個函數,以便在請求結束時呼叫。例如,您可以在 before_request() 回呼函數中記住使用者的當前語言在 cookie 中

from flask import request, after_this_request

@app.before_request
def detect_user_language():
    language = request.cookies.get('user_lang')

    if language is None:
        language = guess_language_from_request()

        # when the response exists, set a cookie with the language
        @after_this_request
        def remember_language(response):
            response.set_cookie('user_lang', language)
            return response

    g.language = language