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
#1 楼
您必须在正确的位置创建模板文件。在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解释其如何尝试查找给定的模板。对于每个已加载的模板,您都会在app.logger
级别上将报告记录到Flask 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 楼
(请注意,上面为文件/项目结构提供的公认答案是绝对正确的。)..
除了正确设置项目文件结构外,我们必须告诉flask查找目录层次结构的适当级别。例如,
..
app = Flask(__name__, template_folder='../templates')
app = Flask(__name__, template_folder='../templates', static_folder='../static')
从
../
开始,向后移动一个目录,然后从那里开始。从
../../
开始,向后移动两个目录,然后从那里开始(依此类推...)。希望这有助于
#4 楼
我不知道为什么,但是我不得不使用以下文件夹结构。我将“模板”提高了一个层次。project/
app/
hello.py
static/
main.css
templates/
home.html
venv/
这可能表明在其他地方配置错误,但是我无法弄清楚那是什么,这可行。 >
评论
您确定您有app = Flask(__ name__)吗?
– Nikhil CSB
11月29日在16:42
#5 楼
检查以下内容:模板文件的名称正确
模板文件位于名为
templates
的子目录中您传递给
render_template
的名称为相对于模板目录(index.html
将直接位于模板目录中,auth/login.html
将位于模板目录中的auth目录下。)您没有与应用程序同名的子目录,或者模板目录位于该子目录中。
如果不起作用,请打开调试(
app.debug = True
),这可能有助于找出问题所在。#6 楼
如果您从已安装的程序包运行代码,请确保模板文件存在于目录<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_ui
,而不是人们期望的os.getcwd()
。很不幸,
setup.py
有一个错误,并且不会复制任何html文件,包括丢失的form.html
。修复setup.py
后,TemplateNotFound的问题就消失了。我希望它能对某人有所帮助。
#7 楼
我遇到了同样的错误,事实证明我唯一做错的就是将我的“模板”文件夹命名为“模板”,而不用“ s”。更改后它可以正常工作,不知道为什么它是东西。
#8 楼
使用render_template()函数时,它尝试在名为template的文件夹中搜索模板,并在以下情况下抛出jinja2.exceptions.TemplateNotFound错误:html文件不存在或
当模板文件夹不存在时
要解决此问题,请执行以下操作:
在python文件所在的同一目录中创建一个具有名称模板的文件夹,并将创建的html文件放置在模板中文件夹。
#9 楼
您需要将所有.html
文件放在python模块旁边的模板文件夹中。并且,如果您的html文件中使用了任何图像,则需要将所有文件放在名为static 的文件夹中,在以下结构中
project/
hello.py
static/
image.jpg
style.css
templates/
homepage.html
virtual/
filename.json
#10 楼
另一种选择是设置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)
#11 楼
我的问题是,我从home.html
内部引用的文件是.j2
而不是.html
,当我将其改回jinja可以读取。愚蠢的错误,但可能会对某人有所帮助。
评论
好像我的本地烧瓶(在Windows上)可以在./Templates/index.html中找到模板,但是当我部署到heroku时(认为它是相同的Python,相同的库版本,包括相同的Flask版本;但是heroku是Unix);并抛出TemplateNotFound错误;在将文件夹git mv重命名为Templates / index.html templates / index.html之后,本地(Windows)和heroku(Unix)版本都可以使用
–红豌豆
19-10-24在0:48
@TheRedPea是的,因为Windows文件系统会折叠大小写,所以Templates == templates。但是Heroku使用区分大小写的文件系统运行Linux。
–马丁·彼得斯(Martijn Pieters)♦
19-10-24在1:02