即使模板文件存在,Flask也会引发TemplateNotFound错误

我正在尝试呈现文件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
256952 次浏览

必须在正确的位置创建模板文件。在Python模块(==您在其中创建Flask应用程序的模块)旁边的templates子目录中。

该错误指示templates/目录中没有home.html文件。确保您在Python模块所在的目录中创建了该目录,并且您确实在该子目录中放置了一个home.html文件。如果您的应用程序是软件包,则应创建Templates文件夹,_ABC_软件包3。

myproject/
app.py
templates/
home.html
myproject/
mypackage/
__init__.py
templates/
home.html

或者,如果您将Templates文件夹命名为除templates之外的其他名称,并且不想将其重命名为默认值,则可以告诉Flask使用其他目录。

app = Flask(__name__, template_folder='template')  # still relative to module

您可以通过将EXPLAIN_TEMPLATE_LOADING选项设置为True,要求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')

Blueprints也可以注册自己的模板目录,但如果您使用Blueprints来简化跨逻辑单元拆分较大项目的操作,则不需要这样做。即使在使用每个蓝图的附加路径时,也总是首先搜索主Flask应用程序模板目录。

检查:

  1. 模板文件具有正确的名称
  2. 模板文件位于名为“templates ”的子目录中
  3. 您传递给render_template的名称是相对于模板目录的(index.html将直接位于模板目录中,auth/login.html将位于模板目录中的AUTH目录下。)
  4. 您没有与应用程序同名的子目录,或者模板目录位于该子目录中。

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

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

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

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

您需要将所有.html文件放在Python模块旁边的模板文件夹中。如果您在HTML文件中使用了任何图像,则需要将所有文件放在名为静态的的文件夹中

在以下结构中

project/
hello.py
static/
image.jpg
style.css
templates/
homepage.html
virtual/
filename.json

我有同样的错误,结果我做错的唯一一件事是将我的“模板”文件夹命名为“模板”,而不是“ S ”。 在改变之后,它工作得很好,不知道为什么它是一件事,但它是。

我认为Flask默认使用目录template。所以你的代码应该是这样的。

假设这是您的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.htmlabout.html,并将这些文件放在templates文件夹中。

当使用呈现_模板()函数时,它尝试在名为Templates的文件夹中搜索模板,并在以下情况下抛出错误jinja2.exceptions.TemplateNotFound:

  1. 文件不存在或
  2. 模板文件夹不存在

在Python文件所在的同一目录中创建一个名为Templates的文件夹,并将创建的HTML文件放在Templates文件夹中。

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

例如..

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

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

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

在子目录中..

template_folder='templates/some_template'

另一种方法是将_ABC设置为_0,这可以解决模板和静态文件夹的问题。

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)

如果从已安装的包运行代码,请确保模板文件位于ABC_0_目录中。


一些细节:

在我的例子中,我试图运行项目烧瓶_简单的_UIjinja的例子,

发现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模板未找到的问题就消失了。

我希望它能帮助一些人。

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

愚蠢的错误,但它可能会帮助别人。

我自己想出的

另一个解释 当您创建Flask应用程序时,根据您提供给Flask构造函数的名称,查找templates的文件夹是应用程序的文件夹:

app = Flask(__name__)

此处的__name__是运行应用程序的模块的名称。因此,相应的文件夹将成为文件夹搜索的根文件夹。

projects/
yourproject/
app/
templates/

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

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

添加模板_文件夹参数的完整路径

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