【问题标题】:Flask per-blueprint error pagesFlask 每个蓝图的错误页面
【发布时间】:2013-10-29 13:48:07
【问题描述】:

我有一个类似这样的烧瓶应用程序:

app.py
blueprints/
    www.py
    shop.py

app.pyblueprints 目录中的每个文件中导入蓝图对象,并将它们注册到具有适当子域的app.py 中的Flask 对象(也从文件中导入)。每个蓝图都会注册错误处理程序,但是这些仅在视图手动调用abort() 时调用,而不是一般错误(即调用shop.py 管理的子域上不存在的URL 会调用app.py 上的错误处理程序。)

有没有办法强制烧瓶将错误传递给正在处理发生错误的子域的蓝图?

【问题讨论】:

    标签: python error-handling flask


    【解决方案1】:

    Flask 的文档 says that this is not possible 用于 404 和 500。如果您需要此功能,您可能可以在蓝图中使用通配符路由来处理 404:

    @a_blueprint.route("<path:invalid_path>")
    def missing_resource(invalid_path):
        return "There isn't anything at " + invalid_path, 404
    

    【讨论】:

    • 恐怕我没有得到你的建议。该路由将匹配路由到a_blueprint 的所有路由。我现在有了大部分解决方案,今晚我可能会回答我自己的问题,但感谢您的尝试。
    • @Drakekin - 我刚刚使用the code in this gist 进行了测试,Werkzeug 实际上在所有这些情况下都做了正确的事情。
    • 我觉得自己太愚蠢了,没想到这一点!谢谢@SeanVieira。我决定改为提出werkzeug.exceptions.NotFound,以便我可以像蓝图上的其他注册错误处理程序一样处理 404 错误。
    【解决方案2】:

    您可以使用 current_app 并将其放入蓝图中。比如:

    shop.py

    from flask import current_app
    
    @current_app.errorhandler(404)
    def page_not_found(e):
    return redirect(url_for('shop.index'))
    

    【讨论】:

    • 这将覆盖在current_app 上针对 404 错误设置的错误处理程序。我认为@Drakekin 试图做的是让status.drakekin.com 的蓝图使用status 蓝图中定义的404 错误处理程序,而api.drakekin.com 的蓝图使用一个不同的 错误处理程序。
    • 我想我需要在特定的蓝图中自定义错误,而不是全部覆盖。
    猜你喜欢
    • 2020-02-28
    • 2021-05-14
    • 2012-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-27
    相关资源
    最近更新 更多