200 votes

Comment faire apparaître une réponse interdite dans django ?

J'aimerais faire ce qui suit :

raise HttpResponseForbidden()

Mais je reçois l'erreur :

exceptions must be old-style classes or derived from BaseException, not HttpResponseForbidden

Comment dois-je m'y prendre ?

422voto

Chris Points 3334

Si vous voulez lever une exception, vous pouvez utiliser :

from django.core.exceptions import PermissionDenied

def your_view(...):
    raise PermissionDenied()

Il est documenté ici :

https://docs.djangoproject.com/en/stable/ref/views/#the-403-http-forbidden-view

Par opposition à la rétention HttpResponseForbidden , en levant PermissionDenied fait en sorte que l'erreur soit rendue à l'aide de la méthode 403.html ou vous pouvez utiliser un intergiciel pour afficher une vue "interdite" personnalisée.

0 votes

Vous pouvez toujours fournir un middleware avec une méthode process_exception et rendre votre vue à partir de là.

2 votes

Peut-on ajouter un message personnalisé dans PermissionDenied ?

2 votes

Jack, oui vous pouvez -- faire quelque chose comme : raise PermissionDenied("No logged in user")

207voto

Ignacio Vazquez-Abrams Points 312628

Retournez-la de la vue comme vous le feriez pour toute autre réponse.

from django.http import HttpResponseForbidden

return HttpResponseForbidden()

38 votes

Pourquoi existe-t-il une classe d'exception Http404 mais pas Http403 ? Pourquoi cette incohérence ?

0 votes

@Flimm stackoverflow.com/questions/3297048/ Je ne suis pas sûr pour Django, mais le cadre REST de Django a : from rest_framework import status status.HTTP_403_FORBIDDEN 403

20 votes

En fait, l'utilisation raise PermissionDenied a l'avantage de vous permettre de montrer votre vue personnalisée 403

12voto

Mario Orlandi Points 29

Vous pouvez éventuellement fournir un modèle personnalisé nommé "403.html" pour contrôler le rendu des erreurs 403 HTTP.

Comme l'a correctement souligné @dave-halter, Le modèle 403 ne peut être utilisé que si vous obtenez PermissionDenied.

Vous trouverez ci-dessous un exemple de vue utilisée pour tester les modèles personnalisés "403.html", "404.html" et "500.html" ; Assurez-vous de mettre DEBUG=False dans les paramètres du projet. ou le framework montrera une traceback à la place pour 404 et 500.

from django.http import HttpResponse
from django.http import Http404
from django.core.exceptions import PermissionDenied

def index(request):

    html = """
<!DOCTYPE html>
<html lang="en">
  <body>
    <ul>
        <li><a href="http://stackoverflow.com/">home</a></li>
        <li><a href="?action=raise403">Raise Error 403</a></li>
        <li><a href="?action=raise404">Raise Error 404</a></li>
        <li><a href="?action=raise500">Raise Error 500</a></li>
    </ul>
  </body>
</html>
"""

    action = request.GET.get('action', '')
    if action == 'raise403':
        raise PermissionDenied
    elif action == 'raise404':
        raise Http404
    elif action == 'raise500':
        raise Exception('Server error')

    return HttpResponse(html)

2 votes

Cela ne fonctionne pas. Le modèle 403 ne peut être utilisé que si vous obtenez PermissionDenied.

0 votes

Merci @dave-halter, vous avez raison. J'ai mis à jour mon commentaire pour le corriger.

4voto

Saad Mirza Points 396

Essayez de cette façon, l'envoi de message avec l'erreur

from django.core.exceptions import PermissionDenied
raise PermissionDenied("You do not have permission to Enter Clients in Other Company, Be Careful")

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