Jak wywołać odpowiedź zabronioną w django


168

Chciałbym wykonać następujące czynności:

raise HttpResponseForbidden()

Ale pojawia się błąd:

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

Jak mam to zrobić?

Odpowiedzi:


183

Zwróć go z widoku, tak jak każdą inną odpowiedź.

from django.http import HttpResponseForbidden

return HttpResponseForbidden()

30
Dlaczego istnieje klasa wyjątków, Http404ale jej nie ma Http403? Skąd ta niekonsekwencja?
Flimm

@Flimm stackoverflow.com/questions/3297048/… Nie jestem pewien co do Django, ale Django REST Framework ma: status importu z rest_framework.HTTP_403_FORBIDDEN 403
David Watson

15
Faktycznie użycie raise PermissionDeniedma tę zaletę, że pozwala pokazać niestandardowy widok 403
guival

376

jeśli chcesz zgłosić wyjątek, możesz użyć:

from django.core.exceptions import PermissionDenied

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

Jest to udokumentowane tutaj:

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

W przeciwieństwie do przywracania HttpResponseForbidden, podnoszenie PermissionDeniedpowoduje renderowanie błędu przy użyciu 403.htmlszablonu lub można użyć oprogramowania pośredniczącego, aby wyświetlić niestandardowy widok „Zabroniony”.


2
Czy możemy dodać niestandardową wiadomość w PermissionDenied?
AJ

2
Jack, tak, możesz - zrób coś takiego: raise PermissionDenied („No logged in user”)
Mark Chackerian

1
Nie jestem pewien, czy to ma znaczenie, ale doktorzy mówią, że throw PermissionDeniednie jako wywołanie funkcji, bez ()na końcu.
Fydo

2
Jaka jest zaleta korzystania z tego w porównaniu z HttpResponseForbidden?
Flimm,

3
@Flimm: To automatycznie uruchamia 403 na poziomie oprogramowania pośredniego, umożliwiając pokazanie niestandardowego widoku „Zabronione”.
Uszkodzone organiczne

11

Opcjonalnie możesz podać niestandardowy szablon o nazwie „403.html”, aby kontrolować renderowanie błędów 403 HTTP.

Jak poprawnie wskazał @ dave-halter, szablon 403 może być użyty tylko wtedy, gdy podniesiesz PermissionDenied

Poniżej znajduje się przykładowy widok używany do testowania niestandardowych szablonów „403.html”, „404.html” i „500.html”; upewnij się, że ustawiłeś DEBUG = False w ustawieniach projektu lub framework pokaże zamiast tego śledzenie dla 404 i 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)

2
To nie działa. Szablon 403 może być używany tylko wtedy, gdy podniesiesz PermissionDenied.
Dave Halter,

Dziękuję @ dave-halter, masz rację. Zaktualizowałem swój komentarz, aby go poprawić.
Mario Orlandi

2

Spróbuj w ten sposób, wysyłając wiadomość z błędem

from django.core.exceptions import PermissionDenied
raise PermissionDenied("You do not have permission to Enter Clients in Other Company, Be Careful")
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.