我试图渲染文件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

当前回答

经过大量的工作,我从这篇文章中得到了解决方案, 链接到解决方案的帖子

添加template_folder参数的全路径

app = Flask(__name__,
        template_folder='/home/project/templates/'
        )

其他回答

我的问题是,我从home.html中引用的文件是.j2而不是.html,当我把它改回来时,jinja可以读取它。

愚蠢的错误,但也许能帮到别人。

您必须在正确的位置创建模板文件;在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应用程序模板的主目录。

检查:

模板文件名称正确 模板文件在名为templates的子目录中 你传递给render_template的名称是相对于模板目录的(index.html将直接在模板目录下,auth/login.html将在模板目录下的auth目录下)。 你要么没有与你的应用同名的子目录,要么模板目录在该子目录中。

如果这不起作用,打开调试(app.debug = True),这可能有助于找出问题所在。

如果您从已安装的包中运行代码,请确保模板文件存在于<python根>/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的问题就消失了。

我希望它能帮助到一些人。

我不知道为什么,但我不得不使用下面的文件夹结构。我把“模板”提升了一层。

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

这可能表明其他地方的配置错误,但我不知道那是什么,这是可行的。