python - 如何为 Flask 中的所有 HTTP 错误实现自定义错误处理程序?

标签 python error-handling flask python-decorators

在我的 Flask 应用程序中,我可以通过为每个错误代码添加 errorhandler 装饰器来轻松扩展由单个自定义错误处理程序处理的错误列表

@application.errorhandler(404)
@application.errorhandler(401)
@application.errorhandler(500)
def http_error_handler(error):
    return flask.render_template('error.html', error=error), error.code

但是,这种方法需要为每个错误代码指定一个显式装饰器。有没有一种方法可以装饰我的(单个)http_error_handler 函数,以便它处理所有 HTTP 错误?

最佳答案

您可以使用 errorhandler带有异常类而不是错误代码作为参数的装饰器,如所述here .因此你可以尝试例如

@application.errorhandler(HTTPException)
def http_error_handler(error):

处理所有 HTTP 错误(大概意味着所有 HTTP 错误代码),甚至

@application.errorhandler(Exception)
def http_error_handler(error):

处理所有未捕获的异常

编辑:查看 flask 源代码后,应用配置中有一个“TRAP_HTTP_EXCEPTIONS”标志,您可以更改它(例如通过执行 app.config['TRAP_HTTP_EXCEPTIONS']=True )。

(大致)当此标志为 false 时,作为 HTTPException 实例的异常将由您用 errorhandler(n) 修饰的函数处理。其中 n是 HTTP 错误代码;当此标志为真时,所有 HTTPException 实例都由您用 errorhandler(c) 修饰的函数处理,其中 c 是异常类。

这样做

app.config['TRAP_HTTP_EXCEPTIONS']=True

@application.errorhandler(Exception)
def http_error_handler(error):

应该实现你想要的。

由于 HTTPException 看起来每个 HTTP 错误代码都有子类(参见 here ),因此设置“TRAP_HTTP_EXCEPTIONS”并使用异常类而不是错误代码装饰错误处理程序看起来是一种更加灵活的处理方式。

作为引用,我的 flask 错误处理现在看起来像:

app.config['TRAP_HTTP_EXCEPTIONS']=True

@app.errorhandler(Exception)
def handle_error(e):
    try:
        if e.code < 400:
            return flask.Response.force_type(e, flask.request.environ)
        elif e.code == 404:
            return make_error_page("Page Not Found", "The page you're looking for was not found"), 404
        raise e
    except:
        return make_error_page("Error", "Something went wrong"), 500

这会做我想做的一切,而且似乎可以处理所有错误,包括 HTTP 错误和内部错误。 if e.code < 400那里有位使用 flask 的默认行为进行重定向等(否则那些最终会成为错误 500,这不是你想要的)

关于python - 如何为 Flask 中的所有 HTTP 错误实现自定义错误处理程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27760113/

相关文章:

python - 从 pandas dropna 中排除特定列

python - 如何同时向 Pandas 中的数据框添加多列?

php - 为什么会出现这些php session_start()错误?

swift - “ fatal error :在展开可选值时意外发现nil”是什么意思?

python - WTForms-用字符串值预填充文本区域字段?

python - Flask 和 OpenLayers

python - 匹配第 8 个逗号后的所有内容

python - 使用 Postman 将外键发布到 Django Rest Framework

jquery - 使用 JQuery Ajax 处理 MVC5 错误

python - 在现有的sqlite关系数据库中创建Index Elasticsearch