Blueprintの使い方メモ

はじめに

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を使わない場合と同じ結果となる。

参考にしたサイト

いまさらながら Flask についてまとめる 〜Blueprint〜 - 適当おじさんの適当ブログ