如何在Django中更改JsonResponse的状态

jaql4c8m  于 2023-05-19  发布在  Go
关注(0)|答案(5)|浏览(257)

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

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

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

2w3rbyxf

2w3rbyxf1#

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

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

qybjjes12#

返回实际状态

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

hgb9j2n63#

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-registered状态码。

ni65a41a

ni65a41a4#

要在JsonResponse中更改状态代码,可以执行以下操作:

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

mutmk8jj5#

这个答案来自Sayse工程,但它的文档。如果查看源代码,您会发现它将剩余的**kwargs传递给超类构造函数HttpStatus。然而,在文档字符串中,他们没有提到这一点。我不知道这是否是假定关键字args将被传递给超类构造函数的约定。
你也可以这样使用它:

JsonResponse({"error": "not found"}, status=404)

我做了一个 Package :

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)

相关问题