未找到蓝图模板 handlers.py

Blueprint Templatenotfound handlers.py

我的应用程序是这样组织的:

#---Project
#   |---- core
#           |_____ views.py
#           |_____ __init__.py
#           |_____ helpers.py
#   |---- error_pages
#           |_____ handlers.py
#           |_____ templates
#                 |_____ 404.html
#   |---- templates
#           |_____ layout.html
#           |_____ index.html
#           |_____ temp.html
#           |_____ tempform.html
#           |_____ tempJS.html

#   |---- static
#           |_____ style.css

#   |----- application.py
#   |----- model.py
#   |----- __init__.py

我想处理文件夹 error_pages.In 中的错误 我有一个 handles.py 文件夹,其中:

from flask import Blueprint, render_template


error_pages = Blueprint('error_pages',__name__, template_folder='/templates')


@error_pages.app_errorhandler(404)
def error_404(error):
    return render_template('404.html'), 404
@error_pages.app_errorhandler(403)
def error_403(error):
    return render_template('403.html'), 403

我的init.py是:

# errors templates
from Project.error_pages.handlers import error_pages
app.register_blueprint(error_pages)

但我想检查错误代码是否正确,是否已填充且不存在 html 页面:错误是:

jinja2.exceptions.TemplateNotFound: 404.html

我有多个正在运行的蓝图(对于用户,...)

有人可以帮忙吗?

之间存在细微但显着的差异
error_pages = Blueprint('error_pages',__name__, template_folder='/templates')

error_pages = Blueprint('error_pages',__name__, template_folder='templates')

您使用的是前者。试试后者。

通过查看您的应用程序树,即使没有 template_folder 属性,蓝图 也应该知道 在哪里可以找到应用程序模板文件夹。

Then why does the template_folder attribute exist, you might ask.

蓝图上下文中 template_folder 的目的是将另一个模板文件夹添加到模板的搜索路径中,但优先级低于实际应用程序的模板文件夹。

如果您的应用程序结构定义不当,这可能会非常棘手。您可能会不小心覆盖蓝图模板。这就是为什么您需要确保为每个蓝图提供不同的相对路径(否则第一个注册的蓝图优先于其他蓝图)。

What's the catch, why would you use "sub-templates"?

我称它们为“子模板”以区别于应用程序模板文件夹。

当您想重构您的应用程序并为每个蓝图提供一个模板时执行此操作。

Example

如果您有一个名为 auth 的蓝图,并且您想要渲染一个名为 auth/login.html 的模板,并已向该蓝图提供 templates 作为 template_folder,您将必须创建一个这样的文件:yourapplication/auth/templates/auth/login.html.

所以最好的办法是像这样布置模板:

yourpackage/
    blueprints/
        auth/
            templates/
                auth/
                    login.html
            __init__.py

额外 auth 文件夹的原因是为了避免我们的模板被实际应用程序模板文件夹中名为 login.html 的模板覆盖。

然后当您想在视图函数中呈现模板时,您可以使用 auth/login.html 作为查找模板的名称。

如果您在加载正确的模板时遇到问题,请启用 EXPLAIN_TEMPLATE_LOADING 配置变量,这将指示 Flask 在每次 render_template 调用时打印出定位模板的步骤。

要回答您的问题,请先修改您的模板路径,如下所示:

error_pages = Blueprint('error_pages',__name__, template_folder='/templates')

然后像这样修改你的项目结构

#   |---- error_pages
#           |_____ handlers.py
#           |_____ templates
#              |_____ error_pages
#                 |_____ 404.html