Mon API renvoie un objet JSON en cas d'erreur mais le code d'état est HTTP 200
:
response = JsonResponse({'status': 'false', 'message': message})
return response
Comment puis-je changer le code de réponse pour indiquer une erreur?
JsonResponse
retourne normalement HTTP 200
, qui est le code de statut de 'OK'
. Afin d'indiquer une erreur, vous pouvez ajouter un code de statut HTTP à JsonResponse
car il s'agit d'une sous-classe de HttpResponse
:
response = JsonResponse({'status':'false','message':message}, status=500)
Renvoyer un statut réel
JsonResponse(status=404, data={'status':'false','message':message})
Pour changer le code de statut dans JsonResponse
, vous pouvez le faire:
response = JsonResponse({'status':'false','message':message})
response.status_code = 500
return response
La bibliothèque http intégrée à Python a une nouvelle classe appelée HTTPStatus qui provient de Python 3.5 . Vous pouvez l'utiliser lorsque vous définissez un status
.
from http import HTTPStatus
response = JsonResponse({'status':'false','message':message}, status=HTTPStatus.INTERNAL_SERVER_ERROR)
La valeur de HTTPStatus.INTERNAL_SERVER_ERROR.value
est 500
. Quand quelqu'un lit votre code, mieux vaut définir quelque chose comme HTTPStatus.<STATUS_NAME>
autre que définir une valeur entière comme 500
. Vous pouvez afficher tous les = codes IANA enregistrés codes d'état de python bibliothèque ici .
Cette réponse de Sayse fonctionne mais elle est non documentée. Si vous regardez la source vous trouvez qu'il passe le reste de **kwargs
au constructeur de la super-classe, HttpStatus. Cependant, dans le docstring, ils ne mentionnent pas cela. Je ne sais pas si c'est la convention de supposer que les arguments de mot clé seront transmis au constructeur de la super-classe.
Vous pouvez aussi l'utiliser comme ça:
JsonResponse({"error": "not found"}, status=404)
J'ai fait un emballage:
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)