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ć?

ocoutts
źródło

Odpowiedzi:

183

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

from django.http import HttpResponseForbidden

return HttpResponseForbidden()
Ignacio Vazquez-Abrams
źródło
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”.

Chris
źródło
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)
Mario Orlandi
źródło
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")
Saad Mirza
źródło