对表单中缺少的键禁用“400 Bad Request”错误

时间:2015-03-09 17:08:18

标签: python flask

Flask explains的文档,如果代码尝试访问不存在的表单密钥,它将返回400 Bad Request错误。这使得调试变得困难,因为错误没有关于缺少哪个键或者是否有其他原因导致错误的信息。

有没有办法禁用400错误并返回" 500内部服务器错误"而在日志中使用回溯?

2 个答案:

答案 0 :(得分:2)

如果您不确定表单是否包含密钥,则应使用.get(key),如果找不到,则返回None,而不是直接将其编入索引。

通常,表单验证根本不应引发错误,但应返回有关验证失败原因的消息。考虑使用诸如WTForms之类的表单库来为您处理验证,这样您就可以得到好消息而不是错误。


如果您仍想弄乱错误而不是进行验证,可以添加自定义错误处理程序来记录异常并返回通用500错误。

from werkzeug.exceptions import abort, BadRequestKeyError

@app.errorhandler(BadRequestKeyError)
def handle_key_error(e):
    app.logger.exception('Missing key {}'.format(e.args[0]))

    # raise a new 500 exception
    # abort doesn't work from inside an error handler
    # so simulate how Flask would handle it
    try:
        abort(500)
    except Exception as new_e:
        app.handle_user_exception(new_e)

您的日志记录设置可能有所不同。未处于调试模式时,应用程序记录器可能需要额外配置。

答案 1 :(得分:1)

所以我找到了一个很好的解决方案。至少使用Flask-restful,但我怀疑Flask-request的情况通常如此。如果您返回400 Bad Request,则检查服务器的JSON响应将为您提供更多数据。例如,在Firefox开发控制台中,转到网络拍摄,单击生成错误请求的请求,单击"响应"选项卡和BAM,这是您有用的调试错误。至少在我自己的服务器上以开发模式运行。