【问题标题】:Return an HTTP fail (e.g. 500) response with JSON body from flask?从烧瓶返回带有 JSON 正文的 HTTP 失败(例如 500)响应?
【发布时间】: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 处理程序)后,我看到主体确实已被填充。浏览器显然在调用错误处理程序后执行此操作。

标签: python http flask


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2011-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    • 1970-01-01
    • 2014-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多