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
Ответы
Ответ 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
Проверь это:
- файл шаблона имеет правильное имя
- файл шаблона находится в подкаталоге с именем
templates
- имя, которое вы передаете
render_template
относится к каталогу шаблонов (index.html
будет находиться непосредственно в каталоге шаблонов, auth/login.html
будет находиться в каталоге auth в каталоге шаблонов.) - либо у вас нет подкаталога с тем же именем, что и у вашего приложения, либо каталог шаблонов находится внутри этого подкаталога.
Если это не сработает, включите отладку (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, когда:
- HTML файл не существует или
- когда папка шаблонов не существует
Решить проблему:
создайте папку с шаблонами имен в том же каталоге, где находится файл 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)