我试图渲染文件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
我认为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,并将这些文件放在模板文件夹中。
您必须在正确的位置创建模板文件;在python模块(==你创建Flask应用的模块)旁边的templates子目录中。
该错误表明在templates/目录中没有home.html文件。确保您创建的目录与python模块所在的目录相同,并且您确实在该子目录中放置了home.html文件。如果你的应用程序是一个包,模板文件夹应该在包中创建。
myproject/
app.py
templates/
home.html
myproject/
mypackage/
__init__.py
templates/
home.html
或者,如果你将模板文件夹命名为模板以外的其他目录,并且不想将其重命名为默认目录,你可以告诉Flask使用其他目录。
app = Flask(__name__, template_folder='template') # still relative to module
通过将EXPLAIN_TEMPLATE_LOADING选项设置为True,您可以要求Flask解释它是如何尝试查找给定模板的。对于每个加载的模板,你会得到一个记录到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应用程序模板的主目录。