FlaskのBlueprintのフックポイント(before_requestとbefore_app_request)について

FlaskのBlueprintには before_requestbefore_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 -