97 votes

Comment puis-je renvoyer le code d'état HTTP 204 à partir d'une vue Django ?

Je veux renvoyer le code d'état 204 No Content à partir d'une vue Django. Il s'agit d'une réponse à un POST automatique qui met à jour une base de données et j'ai juste besoin d'indiquer que la mise à jour a réussi (sans rediriger le client).

Il existe des sous-classes de HttpResponse pour gérer la plupart des autres codes, mais pas le 204.

Quelle est la manière la plus simple de procéder ?

209voto

Steve Mayne Points 9055
return HttpResponse(status=204)

27voto

Mark Points 1278

Lorsque vous utilisez Rendu il existe un status l'argument du mot-clé.

return render(request, 'template.html', status=204)

(Notez que dans le cas du statut 204, il ne devrait pas y avoir de corps de réponse, mais cette méthode est utile pour les autres codes de statut).

23voto

rantanplan Points 3497

Faites ce que Steve Mayne a répondu, ou construisez le vôtre en sous-classant HttpResponse :

from django.http import HttpResponse

class HttpResponseNoContent(HttpResponse):
    status_code = 204

def my_view(request):
    return HttpResponseNoContent()

0voto

Erik Kalkoken Points 10522

Les autres réponses fonctionnent en général, mais elles ne produisent pas de réponses HTTP 204 entièrement conformes, car elles contiennent toujours un en-tête de contenu. Cela peut entraîner des avertissements WSGI et est détecté par des outils de test comme Django Web Test.

Voici une classe améliorée pour une réponse HTTP 204 qui est conforme. (basée sur cette Ticket Django ):

from django.http import HttpResponse

class HttpResponseNoContent(HttpResponse):
    """Special HTTP response with no content, just headers.

    The content operations are ignored.
    """

    def __init__(self, content="", mimetype=None, status=None, content_type=None):
        super().__init__(status=204)

        if "content-type" in self._headers:
            del self._headers["content-type"]

    def _set_content(self, value):
        pass

    def _get_content(self, value):
        pass

def my_view(request):
    return HttpResponseNoContent()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X