Jak zmienić status JsonResponse w Django


Mój interfejs API zwraca obiekt JSON w przypadku błędu, ale kod stanu to
HTTP 200
:
<pre class="lang-py prettyprint-override">
response = JsonResponse({'status': 'false', 'message': message})
return response

Jak mogę zmienić kod odpowiedzi, aby wskazać błąd?
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

JsonResponse
zwykle zwraca
HTTP 200
, który jest kodem stanu dla
„OK”
. Aby wskazać błąd, możesz dodać kod stanu HTTP do
JsonResponse
, ponieważ jest to podklasa
HttpResponse
:
response = JsonResponse({'status':'false','message':message}, status=500)
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Zwraca stan rzeczywisty
JsonResponse(status=404, data={'status':'false','message':message})
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Aby zmienić kod statusu w
JsonResponse
, możesz to zrobić:
response = JsonResponse({'status':'false','message':message})
response.status_code = 500
return response
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Wbudowana biblioteka http w Pythonie ma nową klasę o nazwie HTTPStatus

,
https://docs.python.org/3/libr ... tatus
który pochodzi z Pythona

3.5 I.
https://www.python.org/downloa ... -350/
Dalej. Możesz go użyć podczas definiowania
status
.
from http import HTTPStatus
response = JsonResponse({'status':'false','message':message}, status=HTTPStatus.INTERNAL_SERVER_ERROR)

Wartość
HTTPStatus.INTERNAL_SERVER_ERROR.value
to
500
. Kiedy ktoś czyta Twój kod, lepiej jest zdefiniować coś takiego jak
HTTPStatus. & Lt; STATUS_NAME & >
zamiast wartości całkowitej, takiej jak
500
. Możesz wyświetlić wszystko

zarejestrowany
https://www.iana.org/assignmen ... xhtml
Kody statusu IANA z biblioteki Python

tutaj
https://docs.python.org/3/libr ... codes
.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Ta odpowiedź od Sayse działa, ale jest nieudokumentowana.

Jeśli spojrzysz na źródło
https://github.com/django/djan ... 3L563, przekazuje, że transmituje pozostały ** KWARGS SuperClass Designer, Httpstatus. Jednak w dokumencie nie wspominają o tym. Nie wiem, czy ta umowa ma założyć, że słowa kluczowe Args zostaną przeniesione do projektanta SuperClass.
Możesz również użyć tego w ten sposób:
JsonResponse({"error": "not found"}, status=404)

Zrobiłem opakowanie:
from django.http.response import JsonResponseclass 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)

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się