使用错误处理程序捕获flask应用程序中的413个错误

时间:2018-02-15 15:45:58

标签: python flask exception-handling werkzeug

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

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错误(Request Entity Too Large),我不会被重定向到错误处理程序?相反,我可以像这样创建一个额外的错误处理程序

@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错误?

2 个答案:

答案 0 :(得分:0)

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

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

确实解决了这个问题......虽然不确定

答案 1 :(得分:0)

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

  

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