web-dev-qa-db-fra.com

Comment changer le statut de JsonResponse dans Django

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?

43
Dhanushka Amarakoon

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)
103
Selcuk

Renvoyer un statut réel

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

Pour changer le code de statut dans JsonResponse, vous pouvez le faire:

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

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 .

0

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)
0
Benjamin Atkin