web-dev-qa-db-ja.com

Flaskは、テンプレートファイルが存在する場合でもTemplateNotFoundエラーを発生させます

ファイル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
60
Srdan Ristic

テンプレートファイルを正しい場所に作成する必要があります。 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アプリテンプレートディレクトリは、ブループリントごとに追加のパスを使用する場合でも、常に最初に検索されます。

133
Martijn Pieters

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ファイルを作成し、それらのファイルをテンプレートフォルダーに配置しました。

5
Akshay Karande

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

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

これはおそらく他の場所での設定の誤りを示していますが、それが何であるか分かりませんでした。

4

同じスレッドを成功させることなく同じ問題を解決するためにこのスレッドや他のスレッドをフォローした後、現在のプロジェクトで有効なソリューションを見つけました。 (ファイル/プロジェクト構造に提供された上記の回答は、ほとんどの場合に機能し、完全に正しいことに注意してください。私が具体的に機能したことを示しています。)

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

.cssファイルが.htmlファイルに適切にリンクされていないことを発見した後、同じことが/static/style.cssで機能しました...

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

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

これが役立つことを願っています

3
Rapid537

それを確認します:

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

それでもうまくいかない場合は、デバッグ(app.debug = True)をオンにしてください。これにより、問題の原因を突き止めることができます。

2
Eric

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

1
Shubham Khaire

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

次の構造で

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

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

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

問題を解決するため :

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

0
Atal Kumar

別の方法は、テンプレートと静的フォルダーの両方の問題を修正する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)
0
Brut