即使模板文件存在,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

原文由 Srdan Ristic 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.8k
2 个回答

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

该错误表明 templates/ 目录中没有 home.html 文件。确保您在与 python 模块相同的目录中创建了该目录,并且您确实在该子目录中放置了一个 home.html 文件。如果您的应用程序是一个包,则应在包 创建模板文件夹。

 myproject/
    app.py
    templates/
        home.html

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

或者,如果您将模板文件夹命名为 templates 并且不想将其重命名为默认名称,您可以告诉 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 应用程序模板目录总是首先被搜索,即使在每个蓝图使用附加路径时也是如此。

原文由 Martijn Pieters 发布,翻译遵循 CC BY-SA 4.0 许可协议

我认为 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

您还创建了两个名为 home.htmlabout.html 的 html 文件,并将这些文件放入 templates 文件夹中。

原文由 Akshay Karande 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏