Python 即使模板文件存在,Flask也会引发TemplateNotFound错误
我正在尝试渲染文件Python 即使模板文件存在,Flask也会引发TemplateNotFound错误,python,file,templates,flask,Python,File,Templates,Flask,我正在尝试渲染文件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') 您必须在正确的位置创建模板文
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')
您必须在正确的位置创建模板文件;在python模块(=创建Flask应用程序的模块)旁边的
templates
子目录中
该错误表示templates/
目录中没有home.html
文件。确保您在与python模块相同的目录中创建了该目录,并且确实在该子目录中放置了一个home.html
文件。如果你的应用程序是一个软件包,那么应该在软件包内创建templates文件夹
myproject/
app.py
templates/
home.html
或者,如果您将templates文件夹命名为templates
以外的名称,并且不想将其重命名为默认名称,则可以告诉Flask使用其他目录
app = Flask(__name__, template_folder='template') # still relative to module
通过将设置为True
,您可以要求Flask解释它如何尝试查找给定模板。对于加载的每个模板,您将在INFO
级别获得一个记录到的报告
这就是搜索成功时的样子;在本例中,foo/bar.html
模板扩展了base.html
模板,因此有两个搜索:
调试助手中的信息:定位模板“foo/bar.html”:
1:正在尝试应用程序“flaskpackagename”的加载程序
类:jinja2.loaders.FileSystemLoader
编码:“utf-8”
followlinks:错误
搜索路径:
-/…/project/flaskpackagename/templates
->找到(“/…/project/flaskpackagename/templates/foo/bar.html”)
[2019-06-15 16:03:39203]调试帮助程序中的信息:定位模板“base.html”:
1:正在尝试应用程序“flaskpackagename”的加载程序
类:jinja2.loaders.FileSystemLoader
编码:“utf-8”
followlinks:错误
搜索路径:
-/…/project/flaskpackagename/templates
->找到(“/…/project/flaskpackagename/templates/base.html”)
蓝图也可以,但如果您使用蓝图使更容易在逻辑单元之间拆分更大的项目,则这不是一个要求。始终首先搜索主Flask应用程序模板目录,即使在使用每个蓝图的其他路径时也是如此。请检查:
templates
render\u template
的名称与模板目录相关(index.html
将直接位于模板目录中,auth/login.html
将位于模板目录中的auth目录下。)如果不起作用,请打开调试(
app.debug=True
),这可能有助于找出问题所在。我不知道为什么,但我不得不使用以下文件夹结构。我把“模板”提高了一级
project/
app/
hello.py
static/
main.css
templates/
home.html
venv/
这可能表明其他地方存在错误配置,但我无法确定这是什么,这起到了作用。您需要将所有
.html
文件放在python模块旁边的模板文件夹中。如果html文件中使用了任何图像,则需要将所有文件放在名为static
在以下结构中
project/
hello.py
static/
image.jpg
style.css
templates/
homepage.html
virtual/
filename.json
我也犯了同样的错误,结果我唯一的错误就是把我的“templates”文件夹命名为没有“s”的“template”。
更改后,它工作正常,不知道为什么这是一件事,但它是。我认为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
您还创建了两个名为home.html
和about.html
的html文件,并将这些文件放在templates
文件夹中。使用render\u template()函数时,它尝试在名为templates的文件夹中搜索模板,并在以下情况下抛出错误jinja2.exceptions.TemplateNotFound:
html文件不存在或不存在
当模板文件夹不存在时
要解决此问题,请在python文件所在的同一目录中创建一个名为templates的文件夹,并将创建的html文件放置在templates文件夹中 (请注意,为文件/项目结构提供的上述公认答案绝对正确。)
还有
除了正确设置项目文件结构外,我们还必须告诉flask查看目录层次结构的适当级别
例如
app = Flask(__name__, template_folder='../templates')
从开始。/
向后移动一个目录并从那里开始
从开始。/../
向后移动两个目录并从那里开始(依此类推…)
希望这有帮助另一种选择是设置根路径
,它解决了模板和静态文件夹的问题
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)
如果从安装的软件包运行代码,请确保模板文件位于目录/lib/site packages/your package/templates
中
一些细节:
在我的例子中,我试图运行project的示例,jinja
总是这样说
jinja2.exceptions.TemplateNotFound:form.html
诀窍是示例程序将导入已安装的包flask\u simple\u ui
。在我的例子中,…python/lib/site packages/flask\u simple\u ui
,从包内部使用的ninja
用作查找包路径的根目录。
app = Flask(__name__, template_folder='../templates', static_folder='../static')
root_path = Path(sys.executable).parent if getattr(sys, 'frozen', False) else Path(__file__).parent
app = Flask(__name__.split('.')[0], root_path=root_path)
ENV = jinja2.Environment(loader=jinja2.FileSystemLoader(str(root_path / 'templates')))
template = ENV.get_template(your_template_name)
app = Flask(__name__)
projects/
yourproject/
app/
templates/