[Flask] Blueprintを使ったアプリ開発のテンプレート
本記事ではPythonのWebアプリケーションフレームワークの一つであるFlaskのblueprintの使い方について紹介します。 blueprintを使うことによって、アプリケーションをblueprint単位で分割できます。 特に規模が大きなアプリケーションほど、blueprintの利用によってアプリケーションを分割することでプログラムを管理しやすくなり、得られるメリットが大きいです。 本記事はFlask-Large-Aplication-Exampleを参考にして、特にblueprintに関する箇所を抽出し、簡素化して自分の理解をまとめたものです。 Flaskのblueprintを使って初めてアプリケーションを実装する人の参考になるような入門記事です。
目次
Flaskのインストール
本記事ではPython3を使います。また、Flaskは次の通りインストールします。
$pip install flask
$pip freeze|grep Flask
Flask==1.0.2
アプリケーションのディレクトリ構成
.
├── application.py
├── blueprints.py
├── flask_sample
│ └── views
│ ├── __init__.py
│ ├── example1
│ │ ├── __init__.py
│ │ └── index.py
│ └── example2
│ └── __init__.py
├── run.py
blueprintの作成
blueprints.py
にてblueprintを作成します。
本記事では2つのblueprintを作成します。
from flask import Blueprint
example1 = Blueprint('example1', import_name='flask_sample.views.example1', url_prefix='/example1')
example2 = Blueprint('example2', import_name='flask_sample.views.example2', url_prefix='/example2')
all_blueprints = (
example1,
example2
)
第一引数はblueprintの名前を指定します。 import_name
はこのblueprintが利用するパッケージ名を指定します。 url_prefix
にはこのblueprintのURLの接頭辞を指定します。たとえば example1
という名前のblueprintは URL:PORT/example1
というURLと紐付けられます。
flask_sample/views/example1/__init__.py
および
flask_sample/views/example1/index.py
は以下のように記述します。
from . import index
from blueprints import example1
@example1.route('/')
def index():
return 'example1'
@example1.route('/test')
def test():
return 'test of example1'
flask_sample/views/example2/__init__.py
および
flask_sample/views/example2/index.py
は以下のように記述します。
from . import index
from blueprints import example2
@example2.route('/')
def index():
return 'example2'
@example2.route('/hoge')
def test():
return 'hoge of example2'
@example1.route(URL_SUFFIX)
で関数をデコレートすることによって、その関数は example1
という名前のblueprintで扱えるようになります。
具体的には@example1.route('/')
とすることによって、index
は URL:PORT/example1/
にアクセスした際に実行されるようになります。
また@example1.route('/test')
とすることによって、testx
は URL:PORT/example1/test
にアクセスした際に実行されるようになります。
@example2
も同様です。
blueprintの登録
application.py
にてapplicationを作成し、applicationに上記のblueprintを登録します。
import importlib
import flask
import blueprints
def create_app():
app = flask.Flask(__name__)
for blueprint in blueprints.all_blueprints:
importlib.import_module(blueprint.import_name)
app.register_blueprint(blueprint)
return app
blueprintの登録は以下の行で実行します。
for blueprint in blueprints.all_blueprints:
importlib.import_module(blueprint.import_name)
app.register_blueprint(blueprint)
importlib.import_module(blueprint.import_name)
でPythonモジュールをインポートします。
これを実行しないと、blueprintが利用するPythonモジュールがインポートされず、blueprintも登録できません。
app.register_blueprint(blueprint)
で blueprints.py
にて定義した all_blueprints
のすべての要素を app
に登録します。
サーバの起動
run.py
を以下のように記述し、実行します。
import application
app = application.create_app()
print(app.url_map)
app.run()
これを実行すると以下の結果が得られます。
$python run.py
Map([<Rule '/example1/test' (HEAD, OPTIONS, GET) -> example1.test>,
<Rule '/example2/hoge' (HEAD, OPTIONS, GET) -> example2.test>,
<Rule '/example1/' (HEAD, OPTIONS, GET) -> example1.index>,
<Rule '/example2/' (HEAD, OPTIONS, GET) -> example2.index>,
<Rule '/static/<filename>' (HEAD, OPTIONS, GET) -> static>])
* Serving Flask app "application" (lazy loading)
* Environment: production
WARNING: Do not use the development server in a production environment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
print(app.url_map)
によって、Map(...)
が標準出力に表示されます。
ここで、 /example1
、/example1/test
などが表示されていれば、blueprintが app
に登録されています。
おわり
本記事ではFlaskのblueprintを使ってウェブアプリケーションを作る際に参考となるような基本的な構成を紹介しました。 blueprintを使うことで、アプリケーションの実装をきれいに分割できそうです。