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

当前回答

另一种替代方法是设置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)

其他回答

我有同样的错误,原来我唯一做错的是命名我的'模板'文件夹,'模板'没有's'。 在改变之后,它工作得很好,不知道为什么这是一件事,但它是。

另一种替代方法是设置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)

如果必须使用自定义的项目目录结构(而不是公认的答案项目结构), 我们可以选择告诉flask在目录层次结构的适当级别中查找。

例如. .

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

从…开始/向后移动一个目录并从那里开始。

从../..开始/向后移动两个目录并从那里开始(依此类推…)。

在子目录中…

template_folder='templates/some_template'

另一种解释是我自己想出来的 当你创建Flask应用程序时,模板所在的文件夹是应用程序的文件夹,根据你提供给Flask构造函数的名称:

app = Flask(__name__)

这里的__name__是应用程序正在运行的模块的名称。因此适当的文件夹将成为文件夹搜索的根文件夹。

projects/
    yourproject/
        app/
            templates/

因此,如果你提供了一些随机名称,根文件夹的搜索将是当前文件夹。

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