Look Ma, I’m using Jinja!

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') 

9 ответов

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

Ошибка указывает, что в каталоге 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 объяснить, как он пытался найти данный шаблон, установив > опция для 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 всегда ищется первым, даже если используются дополнительные пути для каждого проекта.

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

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

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

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

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

Если вы запускаете код из установленного пакета, убедитесь, что файлы шаблонов присутствуют в каталоге /lib/site-packages/your-package/templates .

В моем случае я пытался запустить примеры проектов flask_simple_ui и jinja всегда говорил

Хитрость заключалась в том, что пример программы импортировал установленный пакет flask_simple_ui . И ninja , используемый из этого пакета, использует в качестве корневого каталога для поиска пути к пакету, в моем случае . python/lib/site-packages/flask_simple_ui , вместо os.getcwd() , как и следовало ожидать.

К моему несчастью, setup.py имеет ошибку и не копирует html-файлы, включая отсутствующие form.html . После исправления setup.py проблема с TemplateNotFound исчезла.

Надеюсь, это кому-нибудь поможет.

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

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

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

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

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

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

Начиная с ../ перемещает один каталог назад и начинает там.

Начиная с ../../ перемещает две директории назад и начинает там (и так далее . ).

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

Читайте также:  Hiding code in css

Я думаю, что 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 и поместить эти файлы в папку шаблонов.

Источник

Problems with Jinja2: TemplateNotFound: index.html

The error message was due to the lack of a “index.html” file in the “Template” directory. To resolve the issue, simply create a folder name it “Templates”. Then move “index.html” into this newly created folder. ,Save this. Flask runs again and there wouldn’t be any error this time!,Besides, in file “app.py”, revisions need to be made so that it reads something like this:

Besides, in file “app.py”, revisions need to be made so that it reads something like this:

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

Answer by Haley Quinn

I’m trying to build my first GAE app with jinja2. After overcoming a dozen small errors, now I’m stuck with this:,Despite the error message, I have a folder called «templates» and, within it, created the index.html file:,’static’ being the directory in the application where this image lives. ,Here my .html template:

I’m trying to build my first GAE app with jinja2. After overcoming a dozen small errors, now I’m stuck with this:

Traceback (most recent call last): File "C:Program Files (x86)Googlegoogle_appenginelibwebapp2webapp2.py", line 1536, in __call__ rv = self.handle_exception(request, response, e) File "C:Program Files (x86)Googlegoogle_appenginelibwebapp2webapp2.py", line 1530, in __call__ rv = self.router.dispatch(request, response) File "C:Program Files (x86)Googlegoogle_appenginelibwebapp2webapp2.py", line 1278, in default_dispatcher return route.handler_adapter(request, response) File "C:Program Files (x86)Googlegoogle_appenginelibwebapp2webapp2.py", line 1102, in __call__ return handler.dispatch() File "C:Program Files (x86)Googlegoogle_appenginelibwebapp2webapp2.py", line 572, in dispatch return self.handle_exception(e, self.app.debug) File "C:Program Files (x86)Googlegoogle_appenginelibwebapp2webapp2.py", line 570, in dispatch return method(*args, **kwargs) File "C:UsersCGDocumentsudacityHiMonmain.py", line 31, in get template = jinja_environment.get_template('index.html') File "C:Program Files (x86)Googlegoogle_appenginelibjinja2jinja2environment.py", line 719, in get_template return self._load_template(name, self.make_globals(globals)) File "C:Program Files (x86)Googlegoogle_appenginelibjinja2jinja2environment.py", line 693, in _load_template template = self.loader.load(self, name, globals) File "C:Program Files (x86)Googlegoogle_appenginelibjinja2jinja2loaders.py", line 115, in load source, filename, uptodate = self.get_source(environment, name) File "C:Program Files (x86)Googlegoogle_appenginelibjinja2jinja2loaders.py", line 180, in get_source raise TemplateNotFound(template) TemplateNotFound: index.html 
application: himother version: 1 runtime: python27 api_version: 1 threadsafe: yes handlers: - url: /favicon.ico static_files: favicon.ico upload: favicon.ico - url: .* script: main.app libraries: - name: webapp2 version: "2.5.1" - name: jinja2 version: "2.6" 
import os import webapp2 import jinja2 jinja_environment = jinja2.Environment(autoescape=True, loader=jinja2.FileSystemLoader(os.path.join(os.path.dirname(__file__), 'templates'))) class MainPage(webapp2.RequestHandler): def get(self): template_values = < 'name': 'Serendipo', 'verb': 'extremely happy' >template = jinja_environment.get_template('index.html') self.response.out.write(template.render(template_values)) app = webapp2.WSGIApplication([('/', MainPage)], debug=True) 
     Hi there - I'm >, and I > programming!  

Answer by Lacey Harvey

app = Flask(__name__, template_folder=)

Answer by Nikolas Lester

with template content display_include_html.html :,[*] I added a very descriptive title to this issue.,Read open issues with questions until I find 2 issues where I can help someone and add a comment to help there., Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

app = APIRouter() templates = Jinja2Templates(directory='templates/') @app.get('/uptodate_progress_view', response_class=HTMLResponse) def uptodate_progress_view(request: Request, cookie_current_project_name_no_extension: Optional[str] = Cookie(None)): last_html_file_name = get_last_file_name_from_filter('dynamic/%s__*.html'%cookie_current_project_name_no_extension) if not last_html_file_name: return templates.TemplateResponse('display_simple_message.html', context= ) return templates.TemplateResponse('display_include_html.html', context= )

Answer by Estella White

Hello guys, I was following this Tutorial https://youtu.be/QnDWIZuWYW0, and then i got the error message, i looked on Stack overflow, but i don’t understand this part of the code,,Here is a project layout from the flask official tutorial, for now you don’t need any subfolders in your templates/ folder but you may as your project grows and you want to keep things organized.,Any additional routes, you also want to add the corresponding html files to the templates/ folder.,Also flask will look in templates/ by default and not template/ so you will want to rename the folder.

Читайте также:  Row mysql fetch assoc result in php

Hello guys, I was following this Tutorial https://youtu.be/QnDWIZuWYW0, and then i got the error message, i looked on Stack overflow, but i don’t understand this part of the code,

# this code is in the flaskblog.py file from flask import Flask from flask import render_template app = Flask(__name__) @app.route("/") @app.route('/home') def home(): return render_template('home.html') @app.route('/about') def about(): return render_template('about.html') if __name__ == '__main__': app.run(debug=True) # this code is in my home.html    Jack   nothing is in my template file, or about.html file 

Answer by Annalise Krueger

The environment that loaded the template.,By loading ‘app1/index.html’ the file from the app1 package is loaded, by loading ‘app2/index.html’ the file from the second.,The template loader for this environment.,jinja2.environment.Template

from jinja2 import Environment, PackageLoader, select_autoescape env = Environment( loader=PackageLoader("yourapp"), autoescape=select_autoescape() ) 

Источник

Оцените статью