Подтвердить что ты не робот

Как изменить статус JsonResponse в Django

Мой API возвращает объект JSON при ошибке, но код состояния HTTP 200:

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

Как я могу изменить код ответа, чтобы указать на ошибку?

4b9b3361

Ответ 1

JsonResponse обычно возвращает HTTP 200, который является кодом состояния для 'OK'. Чтобы указать ошибку, вы можете добавить код состояния HTTP в JsonResponse, поскольку это подкласс HttpResponse:

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

Ответ 2

Возврат фактического состояния

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

Ответ 3

Чтобы изменить код состояния в JsonResponse, вы можете сделать это:

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

Ответ 4

Встроенная в 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. Вы можете просмотреть все зарегистрированные IANA коды состояния из библиотеки python здесь.

Ответ 5

Этот ответ от 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)