本日は全く管理部もノンプロも関係ないflaskで規模大きめのアプリを作りたい時に利用するblueprintの話です。
1つのapp内に複数別種の機能を折り込みたい時にディレクトリとかをよしなに分割してくれるblueprintさんですが、ちょっと呼び出しする際のディレクトリ構成でつまづいたので、備忘録用にまとめました。
flask blueprintの概要
blueprintとは、そのまま日本語に訳すと、青写真ですかね。設計の青写真を描くためのものです。
機能的には、アプリケーションをURLごとに分けたい場合に利用できるものです。まぁ小さいものであれば、基本の@app.routeで分割していってもいいのですが、テンプレートなどをアプリケーションごとに作成していきたい場合は、将来的な保守を含めるとblueprintの方が有用そうです。
blueprintハマったこと
ハマった事象
rootappのしたに、個別appのディレクトリを作ってblueprintで分割しようとしたらはまりました。subappディレクトリのテンプレートをうまく呼び出してくれませんでした。
エラーを起こす構成とコード
こんな感じにディレクトリを作って失敗しました。黄色い部分がsubappです。
- rootapp/
- app.py
- models/
- __init__.py
- model.py
- database.py
- templates/(細かいファイルは省略)
- static/(細かいファイルは省略
- subapp/
- static/(細かいファイルは省略)
- templates/ (細かいファイルは省略)
- models/(細かいファイルは省略)
- __init__.py
- views.py
app.pyは以下の感じ
from flask import render_template,url_for
app = Flask(__name__)
##メインの部分は省略
from subApp.views import subApp
app.register_blueprint(subApp, url_prefix='/subApp')
if __name__ == '__main__':
app.run(debug=True)
subappないのviews.pyは以下。
from flask import Blueprint, render_template
subApp = Blueprint('subApp', __name__, template_folder='templates', static_folder='./static')
@subApp.route('/')
def index():
return render_template('subApp/index.html')
解決方法
subappのテンプレート内にさらにsubappディレクトリを作って、htmlファイルを保存したら解消しました。
こんな感じの構成にしたら動きます。赤い部分が変更点
- rootapp/
- app.py
- models/
- __init__.py
- model.py
- database.py
- templates/(細かいファイルは省略)
- static/(細かいファイルは省略
- subapp/
- static/(細かいファイルは省略)
- templates/ (細かいファイルは省略)
-subapp/
-layout.html(ベースレイアウト)
-index.html(ベースレイアウト継承のindexファイル)
- models/(細かいファイルは省略)
- __init__.py
- views.py
つまりは、subappのtemplatesの中に再度subappディレクトリを作成してhtml関係を保存すると。。わかりにくい。。
調べて見たらissue立ってる案件でした。。
理由はこちらのブログに書いてあったのですが、jinja2のsearchpathの関係みたいです。
まとめ
blueprintはurl分割してくれるのでありがたいのですが、ちょっとこのディレクトリの作り方は慣れないとミスしそうです。
備忘録でした。