Wie erhebe ich eine in Django verbotene Antwort?

168

Ich möchte Folgendes tun:

raise HttpResponseForbidden()

Aber ich bekomme den Fehler:

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

Wie soll ich das machen?

ocoutts
quelle

Antworten:

183

Geben Sie es wie jede andere Antwort aus der Ansicht zurück.

from django.http import HttpResponseForbidden

return HttpResponseForbidden()
Ignacio Vazquez-Abrams
quelle
30
Warum gibt es eine Ausnahmeklasse, Http404aber nicht Http403? Warum die Inkonsistenz?
Flimm
@Flimm stackoverflow.com/questions/3297048/… Ich bin mir bei Django nicht sicher, aber Django REST Framework hat: vom Status des Importstatus von rest_framework.HTTP_403_FORBIDDEN 403
David Watson
15
Die tatsächliche Verwendung raise PermissionDeniedhat den Vorteil, dass Sie Ihre benutzerdefinierte 403-Ansicht
anzeigen können
376

Wenn Sie eine Ausnahme auslösen möchten, können Sie Folgendes verwenden:

from django.core.exceptions import PermissionDenied

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

Es ist hier dokumentiert:

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

Im Gegensatz zum erneuten Auslösen HttpResponseForbiddenwird beim Auslösen PermissionDeniedder Fehler mithilfe der 403.htmlVorlage gerendert , oder Sie können Middleware verwenden, um eine benutzerdefinierte "Verbotene" Ansicht anzuzeigen.

Chris
quelle
2
Können wir eine benutzerdefinierte Nachricht in PermissionDenied hinzufügen?
AJ
2
Jack, ja, Sie können - etwas tun wie: erhöhen Sie PermissionDenied ("Kein angemeldeter Benutzer")
Mark Chackerian
1
Ich bin mir nicht sicher, ob es darauf ankommt, aber die Dokumente sagen throw PermissionDeniednicht als Funktionsaufruf, ohne das ()am Ende.
Fydo
2
Was ist der Vorteil dieser Verwendung gegenüber HttpResponseForbidden?
Flimm
3
@Flimm: Dies löst automatisch 403 auf Middleware-Ebene aus, sodass Sie Ihre benutzerdefinierte "Verbotene" Ansicht anzeigen können.
Beschädigte Bio
11

Sie können optional eine benutzerdefinierte Vorlage mit dem Namen "403.html" angeben , um das Rendern von 403 HTTP-Fehlern zu steuern.

Wie von @ dave-halter korrekt ausgeführt, kann die 403-Vorlage nur verwendet werden, wenn Sie PermissionDenied auslösen

Unten finden Sie eine Beispielansicht zum Testen der benutzerdefinierten Vorlagen "403.html", "404.html" und "500.html". Bitte stellen Sie sicher, dass DEBUG = False in den Projekteinstellungen festgelegt ist. Andernfalls zeigt das Framework stattdessen einen Traceback für 404 und 500 an.

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
quelle
2
Das funktioniert nicht. Die 403-Vorlage kann nur verwendet werden, wenn Sie PermissionDenied auslösen.
Dave Halter
Danke @ dave-halter, du hast recht. Ich habe meinen Kommentar aktualisiert, um ihn zu korrigieren.
Mario Orlandi
2

Versuchen Sie es auf diese Weise und senden Sie eine Nachricht mit Fehler

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