如何在Django中更改JsonResponse的状态

101

我的 API 在错误时返回一个 JSON 对象,但状态码是 HTTP 200

response = JsonResponse({'status': 'false', 'message': message})
return response

如何更改响应代码以指示错误?
5个回答

231

JsonResponse通常返回HTTP 200,这是代表'OK'的状态码。为了指示错误,您可以将HTTP状态码添加到JsonResponse中,因为它是HttpResponse的子类:

response = JsonResponse({'status':'false','message':message}, status=500)

23

返回实际状态

JsonResponse(status=404, data={'status':'false','message':message})

11

Python内置的HTTP库有一个叫做HTTPStatus的新类,它是从Python 3.5开始引入的。在定义status时可以使用它。

from http import HTTPStatus
response = JsonResponse({'status':'false','message':message}, status=HTTPStatus.INTERNAL_SERVER_ERROR)

HTTPStatus.INTERNAL_SERVER_ERROR.value 的值为 500。当有人阅读你的代码时,最好定义像 HTTPStatus.<STATUS_NAME> 这样的东西,而不是定义像 500 这样的整数值。您可以从 Python 库此处 查看所有IANA注册状态码。


7
要在JsonResponse中更改状态码,可以这样做:
response = JsonResponse({'status':'false','message':message})
response.status_code = 500
return response

4
这个来自Sayse的答案可行,但是没有文档记录。如果你查看源代码,你会发现它将剩余的 **kwargs 传递给了超类构造函数 HttpStatus。然而,在文档字符串中他们没有提到这一点。我不知道是否惯例假定关键字参数将被传递给超类构造函数。
你也可以像这样使用它:
JsonResponse({"error": "not found"}, status=404)

我做了一个包装器:
from django.http.response import JsonResponse

class JsonResponseWithStatus(JsonResponse):
    """
    A JSON response object with the status as the second argument.

    JsonResponse passes remaining keyword arguments to the constructor of the superclass,
    HttpResponse. It isn't in the docstring but can be seen by looking at the Django
    source.
    """
    def __init__(self, data, status=None, encoder=DjangoJSONEncoder,
                 safe=True, json_dumps_params=None, **kwargs):
        super().__init__(data, encoder, safe, json_dumps_params, status=status, **kwargs)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接