【问题标题】:catching 413 errors in flask application with error handlers使用错误处理程序在烧瓶应用程序中捕获 413 错误
【发布时间】:2018-07-26 10:29:52
【问题描述】:

我为这样的烧瓶应用程序编写了一个通用错误处理程序

def error_handler(error):
    if isinstance(error, HTTPException):
        description = error.get_description(request.environ)
        code = error.code
        name = error.name
    else:
        description = ("We encountered an error "
                       "while trying to fulfill your request")
        code = 500
        name = 'Internal Server Error'

    templates_to_try = ['errors/error{}.html'.format(code), 'errors/generic_error.html']
    return render_template(templates_to_try,
                           code=code,
                           name=Markup(name),
                           description=Markup(description),
                           error=error)


def init_app(app):
    ''' Function to register error_handler in app '''
    for exception in default_exceptions:
        app.register_error_handler(exception, error_handler)

    app.register_error_handler(Exception, error_handler)

我在应用中注册为

error_handler.init_app(app)

但是如果出现 413 错误(请求实体太大),我不会被重定向到错误处理程序?相反,我可以像这样创建一个额外的错误处理程序

@app.errorhandler(413)
def request_entity_too_large(error):
    return 'File Too Large', 413

可以很好地捕获错误。 我发现当我在我的应用程序中人为地引发 RequestEntityTooLarge 错误时,错误处理程序工作正常。所以这一定与错误在 werkzeuge 包中引发的事实有关

    RequestBase._load_form_data(self)
File "/usr/local/lib/python2.7/site-packages/werkzeug/wrappers.py", line 385, in _load_form_data
    mimetype, content_length, options)
File "/usr/local/lib/python2.7/site-packages/werkzeug/formparser.py", line 197, in parse
    raise exceptions.RequestEntityTooLarge()
RequestEntityTooLarge: 413 Request Entity Too Large: The data value transmitted exceeds the capacity limit.

有人知道为什么我的第一个解决方案无法捕获 413 错误吗?但我的第二个解决方案可以吗?我需要如何修改我的 error_handler 来捕获 413 错误?

【问题讨论】:

    标签: python flask exception-handling werkzeug


    【解决方案1】:

    好的,我找到了解决方案。将 error_handler 更改为

    return render_template(templates_to_try,
                           code=code,
                           name=Markup(name),
                           description=Markup(description),
                           error=error), code
    

    确实解决了问题……但不知道到底是为什么

    【讨论】:

      【解决方案2】:

      问题出在烧瓶开发服务器上。它并不是一个真正成熟的服务器,在这方面还不够。您不必担心它,因为在生产 WSGI 服务器等中,它可以使用正常的错误处理程序按预期工作。 引用烧瓶文档:

      使用本地开发服务器时,您可能会获得连接 重置错误而不是 413 响应。你会得到正确的状态 使用生产 WSGI 服务器运行应用程序时的响应。

      【讨论】:

        猜你喜欢
        • 2021-03-31
        • 1970-01-01
        • 1970-01-01
        • 2016-12-23
        • 1970-01-01
        • 2023-04-01
        • 2016-12-04
        • 1970-01-01
        • 2022-09-24
        相关资源
        最近更新 更多