はじめに
flaskのBlueprintについて忘れないうちにメモ
Blueprintとは
BlueprintとはFlaskで使われるモジュールであり、アプリケーションの機能を分割して実装するためのものである。
Blueprintを使わない場合
例えば以下のようなプログラムがあったとする。Blueprintを使わない場合、すべてのHTTPリクエストを1つのviews.pyで受ける必要がある。プログラムの規模が大きくなってくるとコードが長くなり保守性が悪い。
階層構造
test
└─views.py
コード
func1とfunc2がそれぞれ機能の塊であるとみなす。
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
from flask import Blueprint
func1 = Blueprint(
'func1',
__name__,
url_prefix='/func1'
)
@func1.route('/a')
def func1_a():
return 'func1_a'
@func1.route('/b')
def func1_b():
return 'func1_b'
func2/views.py
from flask import Blueprint
func2 = Blueprint('func2', __name__, url_prefix='/func2')
@func2.route('/a')
def func2_a():
return 'func2_a'
app.py
from flask import Flask
from func1.views import func1
from func2.views import func2
app = Flask(__name__)
app.register_blueprint(func1)
app.register_blueprint(func2)
if __name__ == '__main__':
app.run(debug=True)
実行結果
app.pyを実行すると、上記Blueprintを使わない場合と同じ結果となる。
参考にしたサイト
いまさらながら Flask についてまとめる 〜Blueprint〜 - 適当おじさんの適当ブログ