如何在 Django 中更改 JsonResponse 的状态

How to change status of JsonResponse in Django

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

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

如何更改响应代码以指示错误?

Return实际状态

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

JsonResponse通常是returnsHTTP 200,这是'OK'的状态码。为了指示错误,您可以向 JsonResponse 添加 HTTP 状态代码,因为它是 HttpResponse:

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

要更改 JsonResponse 中的状态代码,您可以这样做:

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

Python built-in http 库有新的 class 称为 HTTPStatus which is come from 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 这样的整数值。您可以查看所有 IANA-registered status codes from python library here.

Sayse 的这个答案有效,但没有记录。 If you look at the source 你发现它将剩余的 **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)