ファイルhome.html
をレンダリングしようとしています。ファイルはプロジェクトに存在しますが、レンダリングしようとするとjinja2.exceptions.TemplateNotFound: home.html
を取得し続けます。 Flaskテンプレートが見つからないのはなぜですか?
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def home():
return render_template('home.html')
/myproject
app.py
home.html
テンプレートファイルを正しい場所に作成する必要があります。 pythonモジュールの隣にあるtemplates
サブディレクトリ内。
このエラーは、home.html
ディレクトリにtemplates/
ファイルがないことを示しています。 pythonモジュールと同じディレクトリにそのディレクトリを作成し、実際にそのサブディレクトリにhome.html
ファイルを配置したことを確認してください。アプリがパッケージの場合、テンプレートフォルダーをパッケージ内に作成する必要があります。
myproject/
app.py
templates/
home.html
myproject/
mypackage/
__init__.py
templates/
home.html
または、テンプレートフォルダーにtemplates
以外の名前を付け、デフォルトに名前を変更したくない場合は、Flaskに他のディレクトリを使用するように指示できます。
app = Flask(__name__, template_folder='template') # still relative to module
EXPLAIN_TEMPLATE_LOADING
オプション をTrue
に設定することで、Flaskに特定のテンプレートを見つけようとした方法を説明できます。ロードされたテンプレートごとに、レベルINFO
の- Flask app.logger
に記録されたレポートを取得します。
これは、検索が成功した場合の外観です。この例では、foo/bar.html
テンプレートはbase.html
テンプレートを拡張するため、2つの検索があります。
[2019-06-15 16:03:39,197] INFO in debughelpers: Locating template "foo/bar.html":
1: trying loader of application "flaskpackagename"
class: jinja2.loaders.FileSystemLoader
encoding: 'utf-8'
followlinks: False
searchpath:
- /.../project/flaskpackagename/templates
-> found ('/.../project/flaskpackagename/templates/foo/bar.html')
[2019-06-15 16:03:39,203] INFO in debughelpers: Locating template "base.html":
1: trying loader of application "flaskpackagename"
class: jinja2.loaders.FileSystemLoader
encoding: 'utf-8'
followlinks: False
searchpath:
- /.../project/flaskpackagename/templates
-> found ('/.../project/flaskpackagename/templates/base.html')
ブループリントは 独自のテンプレートディレクトリを登録する も可能ですが、ブループリントを使用してより大きなプロジェクトを論理ユニット間で分割しやすくする場合、これは要件ではありません。メインFlaskアプリテンプレートディレクトリは、ブループリントごとに追加のパスを使用する場合でも、常に最初に検索されます。
Flaskはデフォルトでディレクトリテンプレートを使用すると思います。だからあなたのコードは
from flask import Flask,render_template
app=Flask(__name__,template_folder='template')
@app.route("/")
def home():
return render_template('home.html')
@app.route("/about/")
def about():
return render_template('about.html')
if __name__=="__main__":
app.run(debug=True)
また、home.htmlおよびabout.htmlという名前の2つのhtmlファイルを作成し、それらのファイルをテンプレートフォルダーに配置しました。
理由はわかりませんが、代わりに次のフォルダー構造を使用する必要がありました。 「テンプレート」を1レベル上げます。
project/
app/
hello.py
static/
main.css
templates/
home.html
venv/
これはおそらく他の場所での設定の誤りを示していますが、それが何であるか分かりませんでした。
同じスレッドを成功させることなく同じ問題を解決するためにこのスレッドや他のスレッドをフォローした後、現在のプロジェクトで有効なソリューションを見つけました。 (ファイル/プロジェクト構造に提供された上記の回答は、ほとんどの場合に機能し、完全に正しいことに注意してください。私が具体的に機能したことを示しています。)
app = Flask(__name__, template_folder='../templates')
.cssファイルが.htmlファイルに適切にリンクされていないことを発見した後、同じことが/static/style.cssで機能しました...
app = Flask(__name__, template_folder='../templates', static_folder='../static')
プロジェクト構造を適切に設定することに加えて、flaskにディレクトリ階層の適切なレベルを調べるように指示する必要があります。
これが役立つことを願っています
それを確認します:
templates
というサブディレクトリにありますrender_template
に渡す名前は、テンプレートディレクトリに相対的です(index.html
はテンプレートディレクトリに直接、auth/login.html
はテンプレートディレクトリのauthディレクトリの下にあります)。それでもうまくいかない場合は、デバッグ(app.debug = True
)をオンにしてください。これにより、問題の原因を突き止めることができます。
同じエラーがありましたが、間違ったのは「テンプレート」フォルダに「s」なしの「テンプレート」という名前を付けたことだけでした。それがうまくいったことを変更した後、なぜそれが事なのかわからないが、それはそうだ。
すべての.html
ファイルをpythonモジュールの隣のtemplateフォルダーに配置する必要があります。 htmlファイルで使用している画像がある場合は、すべてのファイルをstaticという名前のフォルダーに入れる必要があります
次の構造で
project/
hello.py
static/
image.jpg
style.css
templates/
homepage.html
virtual/
filename.json
Render_template()関数を使用すると、templatesというフォルダー内のテンプレートを検索しようとし、次の場合にエラーjinja2.exceptions.TemplateNotFoundがスローされます。
問題を解決するため :
別の方法は、テンプレートと静的フォルダーの両方の問題を修正するroot_path
を設定することです。
root_path = Path(sys.executable).parent if getattr(sys, 'frozen', False) else Path(__file__).parent
app = Flask(__name__.split('.')[0], root_path=root_path)
Jinja2
を介してテンプレートを直接レンダリングする場合、次のように記述します。
ENV = jinja2.Environment(loader=jinja2.FileSystemLoader(str(root_path / 'templates')))
template = ENV.get_template(your_template_name)