Comment lever une réponse interdite dans django

168

J'aimerais faire ce qui suit:

raise HttpResponseForbidden()

Mais j'obtiens l'erreur:

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

Comment dois-je faire cela?

Occoutts
la source

Réponses:

183

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

from django.http import HttpResponseForbidden

return HttpResponseForbidden()
Ignacio Vazquez-Abrams
la source
30
Pourquoi existe-t-il une classe d'exception Http404mais pas Http403? Pourquoi cette incohérence?
Flimm
@Flimm stackoverflow.com/questions/3297048/… Je ne suis pas sûr de Django, mais Django REST Framework a: de rest_framework import status status.HTTP_403_FORBIDDEN 403
David Watson
15
En fait, l'utilisation raise PermissionDenieda l'avantage de vous permettre d'afficher votre vue 403 personnalisée
guival
376

si vous souhaitez 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

Contrairement à la returing HttpResponseForbidden, la levée PermissionDeniedprovoque le rendu de l'erreur à l'aide du 403.htmlmodèle, ou vous pouvez utiliser un middleware pour afficher une vue «Interdit» personnalisée.

Chris
la source
2
Pouvons-nous ajouter un message personnalisé dans PermissionDenied?
AJ
2
Jack, oui vous pouvez - faire quelque chose comme: augmenter PermissionDenied ("Aucun utilisateur connecté")
Mark Chackerian
1
Je ne sais pas si cela compte, mais les documents disent que ce throw PermissionDeniedn'est pas un appel de fonction, sans le ()à la fin.
Fydo
2
Quel est l'avantage d'utiliser cela par rapport à HttpResponseForbidden?
Flimm
3
@Flimm: Cela déclenche automatiquement 403 au niveau du middleware, vous permettant d'afficher votre vue "Interdit" personnalisée.
Damaged Organic
11

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

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

Voici un exemple de vue utilisé pour tester les modèles personnalisés "403.html", "404.html" et "500.html"; veuillez vous assurer de définir DEBUG = False dans les paramètres du projet ou le framework affichera un suivi à 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="/">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)
Mario Orlandi
la source
2
Cela ne fonctionne pas. Le modèle 403 ne peut être utilisé que si vous augmentez PermissionDenied.
Dave Halter
Merci @ dave-halter, vous avez raison. J'ai mis à jour mon commentaire pour le corriger.
Mario Orlandi
2

Essayez de cette façon, en envoyant un message avec une erreur

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