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

我正在尝试使用自定义的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 -


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

我可以使用错误处理程序

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


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

response.status_code = 204


它不会再次呈现任何内容。

我被困住了,我不知道这种方法在哪里出错。请帮忙。

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

提前致谢。

最佳答案

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


  204(无内容)状态码表示服务器已成功满足请求,并且响应有效载荷主体中没有其他要发送的内容... 204响应由标头字段后的第一个空行终止,因为它不能包含消息正文。


RFC 7231(重点是我的)


  204响应必须不包含消息正文,因此始终由标头字段之后的第一个空行终止。


RFC 2616

关于python - 使用自定义HTTP代码进行Flask abort(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27247722/

10-12 18:30