はじめに
flaskのBlueprintについて忘れないうちにメモ
Blueprintとは
BlueprintとはFlaskで使われるモジュールであり、アプリケーションの機能を分割して実装するためのものである。
Blueprintを使わない場合
例えば以下のようなプログラムがあったとする。Blueprintを使わない場合、すべてのHTTPリクエストを1つのviews.pyで受ける必要がある。プログラムの規模が大きくなってくるとコードが長くなり保守性が悪い。
階層構造
test └─views.py
コード
func1とfunc2がそれぞれ機能の塊であるとみなす。
# views.py from flask import Flask app = Flask(__name__) @app.route('/func1/a') def func1_a(): return 'func1_a' @app.route('/func1/b') def func1_b(): return 'func1_b' @app.route('/func2/a') def func2_a(): return 'func2_a' if __name__ == '__main__': app.run(debug=True)
実行結果
ブラウザで
http://127.0.0.1:5000/func1/a
にアクセスすると func1_aが表示される
http://127.0.0.1:5000/func1/b
にアクセスすると func1_bが表示される
http://127.0.0.1:5000/func2/a
にアクセスすると func2_aが表示される
Blueprintを使用した場合
上でも書いた通り、全部1つのviews.pyに記述すると保守性が悪いため、分割して書きたい。こういうときに利用するのがBlueprintである。
階層構造
func1フォルダとfunc2フォルダを作成し、その中にそれぞれviews.pyを作成する。func1の機能はfunc1/views.pyに記述し、func2の機能はfunc2/views.pyに記述していく。さらに実行用として、app.pyを作成する。
test ├─func1 │ └─views.py ├─func2 │ └─views.py └─app.py
コード
func1/views.py
# func1/views.py from flask import Blueprint # func1のBluePrint func1 = Blueprint( 'func1', # Blueprintの名前 __name__, # __name__とする url_prefix='/func1' # URLの最初の部分 ) @func1.route('/a') # /func1/a def func1_a(): return 'func1_a' @func1.route('/b') # /func1/b def func1_b(): return 'func1_b'
func2/views.py
# func2/views.py from flask import Blueprint # func2のBlueprint func2 = Blueprint('func2', __name__, url_prefix='/func2') @func2.route('/a') def func2_a(): return 'func2_a'
app.py
# app.py from flask import Flask from func1.views import func1 from func2.views import func2 app = Flask(__name__) # blueprintをアプリケーションに登録 app.register_blueprint(func1) app.register_blueprint(func2) if __name__ == '__main__': app.run(debug=True)
実行結果
app.pyを実行すると、上記Blueprintを使わない場合と同じ結果となる。