【发布时间】:2020-03-09 22:08:29
【问题描述】:
从 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)
内容类型标头(正确)为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 响应行为,还是烧瓶做了一些奇怪的事情?
【问题讨论】:
-
我看到您在专业路线中使用了
jsonify,但您是否在正常路线中尝试过return jsonify({"success": 0, "message": "You screwed up."}), 400? -
文档说
dict返回值使用jsonify转换为响应对象;它没有说明元组返回值的各个元素;我认为这意味着您需要自己为元组的第一个元素创建正确的响应对象。 -
@chepner,也试过了。我认为我的问题最终是我在我的 jquer.ajax 调用中过早地在客户端(chrome 浏览器)端设置断点。在我继续执行(从而退出
error处理程序)后,我看到主体确实已被填充。浏览器显然在调用错误处理程序后执行此操作。