FlaskのBlueprintには before_request
と before_app_request
のフックポイントがあり、どう呼ばれるのか検証していた。
API — Flask Documentation (1.1.x)
ドキュメントを読んでも、実行される順番や条件がわかりづらい。
検証コード
Flaskのバージョンは1.1.2
app.py
from flask import Flask, Blueprint # Flask==1.1.2 app = Flask(__name__) bp1 = Blueprint('bp1', __name__) @bp1.before_app_request def bp1_before_app_request(): """before_app_requestはすべてのリクエストでviewの前に呼ばれる """ print("bp1 before_app_request") @bp1.before_request def bp1_before_request(): """before_requestは対象のBlueprintへルーティングされるリクエストでviewの前に呼ばれる """ print("bp1 before_request") @bp1.route("/bp1") def bp1_view(): print("bp1 view") return "/bp1" bp2 = Blueprint('bp2', __name__) @bp2.before_app_request def bp2_before_app_request(): print("bp2 before_app_request") @bp2.before_request def bp2_before_request(): print("bp2 before_request") @bp2.route("/bp2") def bp2_view(): print("bp2 view") return "/bp2" @app.before_request def app_before_request1(): """Flask.before_requestはすべてのリクエストでviewの前に呼ばれる """ print("Flask before_request1") app.register_blueprint(bp1) app.register_blueprint(bp2) @app.before_request def app_before_request2(): """登録順で実行されるので、こちらはbp2.before_app_requestよりも後になる """ print("Flask before_request2") app.run(host="0.0.0.0")
実行結果
Flask.before_request
で登録した関数は、すべてのリクエストでviewの前に呼ばれるBlueprint.before_app_request
で登録した関数は、Flask.before_request
と同様にすべてのリクエストでviewの前に呼ばれるFlask.before_request
と同じ扱いで、登録した順番で実行される
Blueprint.before_request
で登録した関数は、対象のBlueprintにルーティングされるリクエストでviewの前に呼ばれる- 内部的には、
Flask.before_request_funcs
に登録されたものを呼び出しているようだ
$ python app.py * Serving Flask app "app" (lazy loading) * Environment: production WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. * Debug mode: off * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit) Flask before_request1 # /bp1へアクセスしたとき bp1 before_app_request bp2 before_app_request Flask before_request2 bp1 before_request bp1 view 127.0.0.1 - - [14/May/2020 01:34:13] "GET /bp1 HTTP/1.1" 200 - Flask before_request1 # /bp2へアクセスしたとき bp1 before_app_request bp2 before_app_request Flask before_request2 bp2 before_request bp2 view 127.0.0.1 - - [14/May/2020 01:34:17] "GET /bp2 HTTP/1.1" 200 -