web-dev-qa-db-fra.com

Comment déclencher 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 faire cela?

142
ocoutts

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

from Django.http import HttpResponseForbidden

return HttpResponseForbidden()
156

si vous voulez lever une exception, vous pouvez utiliser:

from Django.core.exceptions import PermissionDenied
raise PermissionDenied

C'est documenté ici: 

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

Contrairement à la rétention de HttpResponseForbidden, la levée de PermissionDenied entraîne le rendu de l'erreur à l'aide du modèle 403.html. Vous pouvez également utiliser un middleware pour afficher une vue "Interdit" personnalisée.

330
Chris

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

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

Vous trouverez ci-dessous un exemple d’affichage permettant de tester les modèles personnalisés "403.html", "404.html" et "500.html"; assurez-vous de définir DEBUG = False dans les paramètres du projet ou le cadre affichera une trace à 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)
10
Mario Orlandi

Essayez cette manière, en envoyant un message avec erreur 

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