1. ホーム
  2. python

[解決済み] テンプレートファイルが存在するにもかかわらず、Flask が TemplateNotFound エラーを発生させる

2022-01-31 16:39:07

質問

私はファイルをレンダリングしようとしています 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

解決方法は?

テンプレートファイルを正しい場所に作成する必要があります。 templates サブディレクトリの隣にある python モジュール (== あなたが Flask アプリを作成したモジュール)。

このエラーは home.html ファイルを templates/ ディレクトリを作成します。そのディレクトリを Python モジュールと同じディレクトリに作成したこと、そして実際に home.html ファイルをそのサブディレクトリに置きます。 アプリがパッケージの場合、templates フォルダを作成する必要があります。 内部 パッケージです。

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

を設定することで、Flask に与えられたテンプレートをどのように見つけようとしたのかを説明させることができます。 EXPLAIN_TEMPLATE_LOADING オプション から True . テンプレートが読み込まれるごとに、ログに記録されたレポートが フラスコ app.logger レベル INFO .

検索に成功するとこのように表示されます。この例では 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アプリテンプレートディレクトリは常に最初に検索されます。