延期されたリクエストのコールバック
Flaskの設計原則の1つは、応答オブジェクトが作成され、それらを変更または置換できる潜在的なコールバックのチェーンに渡されることです。 リクエスト処理が開始されたとき、レスポンスオブジェクトはまだありません。 必要に応じて、ビュー機能またはシステム内の他のコンポーネントによって作成されます。
応答がまだ存在しないポイントで応答を変更したい場合はどうなりますか? その一般的な例は、応答オブジェクトにCookieを設定するbefore_request()
コールバックです。
1つの方法は、状況を回避することです。 多くの場合、それは可能です。 たとえば、代わりにそのロジックを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