質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

333閲覧

同一のテンプレートを複数のプロジェクトから参照したい

gogotowel

総合スコア9

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2022/09/18 22:15

実現したいこと

お世話になっております。

表題の通り、複数のプロジェクトから同一のテンプレートを参照する方法を探しています。
プロジェクトフォルダ直下のtemplatesに加え、状況に応じてプロジェクト共有のフォルダにテンプレートを探しにいくようなイメージです。
教えていただけるとありがたいです。

試したこと

動的に参照先を変更する必要があるため、Flask初期化の際にtemplate_folderを指定するやり方は今回NGでした。また、カレントのディレクトリを変更してみたりもしましたが、templatesから動かすことは叶いませんでした。

補足情報(FW/ツールのバージョンなど)

Python 3.9.5
Flask 2.0.2

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

quickquip

2022/09/19 00:31

単一のフォルダで駄目な理由、プロジェクトをBlueprintsにすることで解決しない理由、が書かれてないように思います。
gogotowel

2022/09/19 07:29

ありがとうございます。 管理の都合でフォルダを分けています。 ログインの機能を持つプログラムを共有のフォルダに置き、実行するプログラム群にBlueprintsで実装させています。そこでログインプログラムのテンプレートはログインのフォルダに置きたいと考えています。
quickquip

2022/09/19 08:10

日本語で書かれると「それで合ってます。それで動きますよね」としか思えないです。 今の具体的なディレクトリ構造と、それで困っていることを書いた方がよいと思います。
guest

回答1

0

ベストアンサー

https://flask.palletsprojects.com/en/2.2.x/blueprints/#templates

The template folder is added to the search path of templates but with a lower priority than the actual application’s template folder.

Blueprintのコンストラクタで指定したtemplateフォルダは、テンプレート群の探索パスに追加されますが、アプリケーションのテンプレートよりも低い優先度を持ちます。
逆にいうとアプリケーションのテンプレートフォルダはBlueprintのコンストラクタで指定したテンプレートフォルダより優先されます
そもそもテンプレートの探索は動的であって、Blueprintとアプリケーションとで場所は分離されているけれども探索の名前空間は共通です。

The reason for the extra admin folder is to avoid getting our template overridden by a template named index.html in the actual application template folder.

とある通り、Blueprint ごとのテンプレートフォルダの中に(冗長に思えるかもしれませんが)個別のディレクトリを用意してテンプレートの名前を切り分けるのが常套手段です。
アプリケーションの方のテンプレートが探索されて、そちらで上書きされるのを防ぐためです。


plain

1├── app.py 2├── blueprint_a 3│ ├── bp_templates 4│ │ └── blueprint_a 5│ │ └── index.html 6│ └── views.py 7└── templates 8 └── common 9 └── form.html

と作って、
app.py

python

1from flask import Flask 2 3from blueprint_a import views as bp_a 4 5app = Flask(__name__) 6app.register_blueprint(bp_a.app) 7 8if __name__ == "__main__": 9 app.run(debug=True)

blueprint_a/views.py

python

1from flask import Blueprint, render_template 2 3# Blueprintのオブジェクトを生成する 4app = Blueprint('views', __name__, url_prefix='/bp', template_folder='bp_templates') 5 6 7@app.route('/') 8def home(): 9 title = "タイトルです" 10 return render_template('blueprint_a/index.html', title=title)

blueprint_a/bp_templates/blueprint_a/index.html

html

1<!DOCTYPE html> 2<html lang="ja"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>{{title}}</title> 6 </head> 7 8 <body> 9 {% include 'common/form.html' %} 10 </body> 11</html>

templates/common/form.html

インクルードされた部分

として、実行して

shell

1% curl http://localhost:5000/bp/ 2<!DOCTYPE html> 3<html lang="ja"> 4 <head> 5 <meta charset="UTF-8"> 6 <title>タイトルです</title> 7 </head> 8 9 <body> 10 インクルードされた部分 11 </body> 12</html>

何に困っているのか分からない状況ですがひとまず。

投稿2022/09/19 12:00

編集2022/09/20 00:08
quickquip

総合スコア11038

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gogotowel

2022/09/19 21:33

ご教示いただき大変ありがとうございました。 Blueprint側でtemplatesフォルダを用意できるんですね。早速試してみたいと思います。
quickquip

2022/09/20 00:31 編集

「今どうやってBlueprintを使っているか」を示さない限り、質問者さんがBlueprint側でtemplatesフォルダを用意してないことは伝わりませんよね!!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問