Flask abort()带有自定义http代码

时间:2014-12-02 10:58:29

标签: python exception flask http-status-code-204

我在我的项目中使用Flask框架和纯json api。它只呈现没有html或静态文件的json响应。

我正在尝试使用自定义http代码实现 abort()功能,在我的情况下是204(无内容),默认情况下未定义。我目前的代码如下:

# Error define
class NoContent(HTTPException):
    code = 204
    description = ('No Content')

abort.mapping[204] = NoContent

def make_json_error(ex):
    response = jsonify(error=str(ex))
    response.status_code = (ex.code
                        if isinstance(ex, HTTPException)
                        else 500)
    return response

custom_exceptions = {}
custom_exceptions[NoContent.code] = NoContent

for code in custom_exceptions.iterkeys():
    app.error_handler_spec[None][code] = make_json_error

# Route
@app.route("/results/<name>")
def results(name=None):
    return jsonify(data=results) if results else abort(204)

效果很好我得到的反应如下:

127.0.0.1 - - [02/Dec/2014 10:51:09] "GET /results/test HTTP/1.1" 204 -

但没有任何内容。它什么都不呈现,甚至在浏览器中都没有空白页。

我可以使用errorhandler

@app.errorhandler(204)
def error204(e):
    response = jsonify(data=[])
    return response

但它返回200个http代码。这里需要204。当我在error204()行中添加如:

response.status_code = 204

它再一次没有呈现。

我被困住了,我不知道这种方法有什么错误。请帮忙。

如果从设计角度来看我的做法是错误的,请提出其他建议。

提前致谢。

2 个答案:

答案 0 :(得分:5)

请记住,HTTP 204 is "No Content"RFC 7231(以及之前的RFC 2616要求用户代理忽略最后一个标题行后的所有内容:

  

204(无内容)状态代码表示服务器已成功完成请求,并且没有其他内容要在响应有效负载正文中发送... 204响应由第一个空行终止标题字段之后,因为它不能包含邮件正文。

RFC 7231(强调我的)

  

204响应绝不能包含消息体,因此总是在头字段后面的第一个空行终止。

RFC 2616

答案 1 :(得分:2)

您需要在错误处理程序中返回状态代码。

@app.errorhandler(204)
def error204(e):
    response = jsonify(data=[])
    return response, 204

退出状态代码被Flask解释为200。