Подтвердить что ты не робот

Flask вызывает ошибку TemplateNotFound, даже если файл шаблона существует

Я пытаюсь сделать файл home.html. Файл существует в моем проекте, но я продолжаю получать jinja2.exceptions.TemplateNotFound: home.html, когда пытаюсь его отобразить. Почему флажок не может найти мой шаблон?

from flask import Flask, render_template

app = Flask(__name__)

@app.route('/')
def home():
    return render_template('home.html')
/myproject
    app.py
    home.html
4b9b3361

Ответ 1

Вы должны создать файлы шаблона в правильном месте; в подкаталоге templates рядом с вашим модулем python.

Ошибка указывает на то, что в home.html templates/ нет файла home.html. Убедитесь, что вы создали этот каталог в том же каталоге, что и ваш модуль 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

Вы можете попросить Flask объяснить, как он пытался найти данный шаблон, установив для параметра EXPLAIN_TEMPLATE_LOADING значение True. Для каждого загруженного шаблона вы получите отчет, зарегистрированный в Flask app.logger, на уровне INFO.

Вот как это выглядит при успешном поиске; в этом примере шаблон foo/bar.html расширяет шаблон base.html, поэтому выполняется два поиска:

[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

Я думаю, что 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

также вы создали два html файла с именами home.html и about.html и поместили эти файлы в папку шаблонов.

Ответ 3

Я не знаю почему, но мне пришлось вместо этого использовать следующую структуру папок. Я положил "шаблоны" на один уровень выше.

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

Это, вероятно, указывает на неправильную конфигурацию в другом месте, но я не мог понять, что это было, и это сработало.

Ответ 4

После того, как я следовал этой теме и другим за решением той же проблемы, но безуспешно, я нашел рабочее решение для моего текущего проекта. (Обратите внимание, что принятый выше ответ, предоставленный для структуры файла/проекта, будет работать в большинстве случаев и является абсолютно правильным, я просто показываю, что конкретно сработало для меня.)

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

то же самое сработало для /static/style.css после обнаружения файлов .css неправильно ссылались на файлы .html...

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

в дополнение к правильной настройке структуры проекта, мы должны указать колбе смотреть на соответствующем уровне иерархии каталогов.

надеюсь, это поможет

Ответ 5

Проверь это:

  1. файл шаблона имеет правильное имя
  2. файл шаблона находится в подкаталоге с именем templates
  3. имя, которое вы передаете render_template относится к каталогу шаблонов (index.html будет находиться непосредственно в каталоге шаблонов, auth/login.html будет находиться в каталоге auth в каталоге шаблонов.)
  4. либо у вас нет подкаталога с тем же именем, что и у вашего приложения, либо каталог шаблонов находится внутри этого подкаталога.

Если это не сработает, включите отладку (app.debug = True), которая может помочь выяснить, что не так.

Ответ 6

Вам нужно поместить все файлы .html в папку шаблон рядом с вашим модулем python. И если есть какие-либо изображения, которые вы используете в ваших html файлах, вам нужно поместить все ваши файлы в папку с именем static

В следующей структуре

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

Ответ 7

У меня была та же ошибка, оказалось, что единственное, что я сделал неправильно, - это назвал мою папку 'templates', 'template' без 's'. После изменения, что он работал нормально, не знаю, почему это вещь, но это так.

Ответ 8

При добавлении ответов на вопросы название папки должно быть правильным, например: шаблон не будет работать, это должны быть шаблоны

Ответ 9

Кто-нибудь получил ответ на этот вопрос? Я перепробовал все, что сказали ответы, и я все еще получаю ту же ошибку.

Ответ 10

Когда используется функция render_template(), она пытается найти шаблон в папке с именем templates и выдает ошибку jinja2.exceptions.TemplateNotFound, когда:

  1. HTML файл не существует или
  2. когда папка шаблонов не существует

Решить проблему:

создайте папку с шаблонами имен в том же каталоге, где находится файл python, и поместите html файл, созданный в папку шаблонов.

Ответ 11

Другой альтернативой является установка 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)