Мой API возвращает объект JSON при ошибке, но код состояния HTTP 200
:
response = JsonResponse({'status': 'false', 'message': message})
return response
Как я могу изменить код ответа, чтобы указать на ошибку?
Мой API возвращает объект JSON при ошибке, но код состояния HTTP 200
:
response = JsonResponse({'status': 'false', 'message': message})
return response
Как я могу изменить код ответа, чтобы указать на ошибку?
JsonResponse
обычно возвращает HTTP 200
, который является кодом состояния для 'OK'
. Чтобы указать ошибку, вы можете добавить код состояния HTTP в JsonResponse
, поскольку это подкласс HttpResponse
:
response = JsonResponse({'status':'false','message':message}, status=500)
Возврат фактического состояния
JsonResponse(status=404, data={'status':'false','message':message})
Чтобы изменить код состояния в JsonResponse
, вы можете сделать это:
response = JsonResponse({'status':'false','message':message})
response.status_code = 500
return response
Встроенная в 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 здесь.
Этот ответ от 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)