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


107

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

回答:


212

テンプレートファイルは正しい場所に作成する必要があります。templatespythonモジュールの横のサブディレクトリ。

エラーはhome.htmltemplates/ディレクトリにファイルがないことを示しています。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オプションをに設定することで、Flaskが特定のテンプレートを見つけようとした方法を説明するように要求できますTrue。ロードされたすべてのテンプレートについて、レベルでFlaskapp.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アプリテンプレートディレクトリが常に最初に検索されます。


2
EXPLAIN_TEMPLATE_LOADINGは、テンプレートに関するパスの問題をデバッグするのに非常に役立ちます。また、ブループリントを使用する場合は、ブループリントごとにtemplate_folderパスを設定してください。
ジャスティンクラウゼ

1
@JustinKrause:これらのおかげで、EXPLAIN_TEMPLATE_LOADINGこの回答が最初に書かれた後に追加されました。
Martijn Pieters

1
私のローカルフラスコ(Windows)は内./Templates/index.htmlでテンプレートを見つけることができるようですが、herokuにデプロイすると(同じPython、同じライブラリバージョン、同じFlaskバージョンを含むと思いましたが、herokuはUnixです)。TemplateNotFoundエラーをスローします。フォルダの名前を変更した後git mv Templates/index.html templates/index.html、ローカル(Windows)バージョンとheroku(Unix)バージョンの両方が機能しました
Red Pea

1
@TheRedPeaはい、Windowsファイルシステムは大文字小文字を区別するためTemplates== templatesです。ただし、HerokuはLinuxを実行し、大文字と小文字を区別するファイルシステムを備えています。
Martijn Pieters

11

Flaskはデフォルトでディレクトリテンプレートを使用すると思います。だからあなたのコードはこれがあなたのhello.pyであると仮定するべきです

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)

そしてあなたはスペース構造を

project/
    hello.py        
    template/
         home.html
         about.html    
    static/
           js/
             main.js
           css/
               main.css

また、home.htmlおよびabout.htmlという名前の2つのhtmlファイルを作成し、それらのファイルをテンプレートフォルダーに配置します。


8

(ファイル/プロジェクト構造について提供された上記の承認済み回答は完全に正しいことに注意してください。)

また。

プロジェクトファイル構造を正しく設定することに加えて、フラスコにディレクトリ階層の適切なレベルを調べるように指示する必要があります。

例えば..

    app = Flask(__name__, template_folder='../templates')
    app = Flask(__name__, template_folder='../templates', static_folder='../static')

で開始すると、../1つのディレクトリが後方に移動し、そこから開始します。

で開始すると、../../2つのディレクトリが後方に移動し、そこから開始します(以下同様)。

お役に立てれば


4

理由はわかりませんが、代わりに次のフォルダー構造を使用する必要がありました。「テンプレート」を1レベル上げました。

project/
    app/
        hello.py
        static/
            main.css
    templates/
        home.html
    venv/

これはおそらく他の場所での設定ミスを示していますが、それが何であるかを理解できず、これが機能しました。


3

それを確認します:

  1. テンプレートファイルの名前は正しい
  2. テンプレートファイルは、次のサブディレクトリにあります。 templates
  3. 渡す名前render_templateは、テンプレートディレクトリを基準にしていindex.htmlます(テンプレートディレクトリに直接あり、テンプレートディレクトリauth/login.htmlのauthディレクトリの下にあります)。
  4. アプリと同じ名前のサブディレクトリがないか、テンプレートディレクトリがそのサブディレクトリ内にあります。

それでも問題が解決しない場合は、デバッグをオンにして(app.debug = True)、何が問題かを理解するのに役立つ可能性があります。


3

インストールされたパッケージからコードを実行する場合は、テンプレートファイルがdirectoryに存在することを確認してください<python root>/lib/site-packages/your-package/templates


いくつかの詳細:

私の場合は、flask_simple_uiプロジェクトの例を実行しようとしていて、jinja常に

jinja2.exceptions.TemplateNotFound:form.html

トリックは、サンプルプログラムがインストールされたパッケージをインポートすることflask_simple_uiでした。そしてninja、そのパッケージの内部から使用されているのは、私の場合...python/lib/site-packages/flask_simple_uios.getcwd() 予想されるのではなく、ルートのディレクトリとしてパッケージパスを検索するためです。

私の不運なことにsetup.py、バグがあり、欠落してform.htmlいるを含むhtmlファイルをコピーしません。を修正するsetup.pyと、TemplateNotFoundの問題はなくなりました。

誰かのお役に立てば幸いです。


2

同じエラーが発生しましたが、私が間違った唯一のことは、「テンプレート」フォルダに「s」なしの「テンプレート」という名前を付けることでした。それを変更した後、それがうまくいったこと、なぜそれが事なのかわからないがそれはそうです。


2

render_template()関数を使用すると、templatesというフォルダーでテンプレートを検索しようとし、次の場合にエラーjinja2.exceptions.TemplateNotFoundをスローします。

  1. htmlファイルが存在しないか、
  2. テンプレートフォルダが存在しない場合

問題を解決するため :

pythonファイルが配置されているのと同じディレクトリにテンプレートという名前のフォルダーを作成し、テンプレートフォルダーに作成されたhtmlファイルを配置します。


1

すべての.htmlファイルをpythonモジュールの隣のテンプレートフォルダーに配置する必要があります。そして、htmlファイルで使用している画像がある場合は、すべてのファイルをstaticという名前のフォルダーに配置する必要があります。

次の構造で

project/
    hello.py
    static/
        image.jpg
        style.css
    templates/
        homepage.html
    virtual/
        filename.json

1

もう1つの方法は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)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.