首页 > 解决方案 > 从烧瓶返回带有 JSON 正文的 HTTP 失败(例如 500)响应?

问题描述

从 flask 1.1.x 开始,很容易返回 JSON 响应正文以及 HTTP 成功代码,例如

return {"success": 1, "message": "You did it!"}, 200

但是,以相同的方式返回 HTTP 失败状态

return {"success": 0, "message": "You screwed up."}, 400

似乎只返回一个响应头和消息,(例如HTTP/1.0 INVALID REQUEST

Content-type 标题(正确)说application/json,但是,正文是空的。任何非 2xx 类状态代码都会发生这种情况。

Flask 文档暗示我应该能够做到这一点,但是,我尝试过的任何方法似乎都不起作用。这包括创建专门的错误处理程序,例如

@app.errorhandler(400)
def custom400(error):
    return jsonify({'message': error})

然后调用abort(400, 'my error message'),这不起作用,因为error处理程序的参数不是传递给的字符串abort,而是始终是 HTTP 错误是什么类型的错误对象(例如 410 -> <GONE Gone>.

这是“正常”的 HTTP 响应行为,还是烧瓶做了一些奇怪的事情?

标签: pythonhttpflask

解决方案


事实证明,这比其他任何东西都更像 PEBKAC。我在我的$.ajax.error处理程序中设置了一个断点,在断点触发时查看浏览器(chrome)调试窗口中返回的响应。

但是,在此处理程序存在之后,调试窗口才能使用响应的主体。一旦我继续执行error处理程序,JSON 响应主体就会按预期通过。


推荐阅读