Come faccio a suscitare una risposta proibita in Django


168

Vorrei fare quanto segue:

raise HttpResponseForbidden()

Ma ottengo l'errore:

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

Come dovrei farlo?

Risposte:


183

Restituiscilo dalla vista come faresti con qualsiasi altra risposta.

from django.http import HttpResponseForbidden

return HttpResponseForbidden()

30
Perché esiste una classe di eccezione Http404ma no Http403? Perché l'incoerenza?
Flimm,

@Flimm stackoverflow.com/questions/3297048/... Io non sono sicuro di Django, ma Django REST quadro deve: dallo status rest_framework import status.HTTP_403_FORBIDDEN 403
David Watson

15
In realtà l'utilizzo raise PermissionDeniedha il vantaggio di farti mostrare la tua vista 403 personalizzata
Guival

376

se vuoi sollevare un'eccezione puoi usare:

from django.core.exceptions import PermissionDenied

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

È documentato qui:

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

A differenza della returing HttpResponseForbidden, il rilancio PermissionDeniedprovoca il rendering dell'errore utilizzando il 403.htmlmodello oppure è possibile utilizzare il middleware per mostrare una vista "Proibita" personalizzata.


2
Possiamo aggiungere un messaggio personalizzato in PermissionDenied?
AJ

2
Jack, sì, puoi - fare qualcosa del genere: aumentare PermissionDenied ("Nessun utente connesso")
Mark Chackerian

1
Non sono sicuro che sia importante, ma i documenti throw PermissionDeniednon dicono come una chiamata di funzione, senza il ()alla fine.
Fydo,

2
Qual è il vantaggio di utilizzare questo su HttpResponseForbidden?
Flimm,

3
@Flimm: questo attiva automaticamente 403 a livello di middleware, consentendoti di mostrare la tua vista "Proibita" personalizzata.
Danneggiato Biologico

11

Se lo desideri, puoi fornire un modello personalizzato chiamato "403.html" per controllare il rendering degli errori HTTP 403.

Come sottolineato correttamente da @ dave-halter, il modello 403 può essere utilizzato solo se si aumenta PermissionDenied

Di seguito è riportata una vista di esempio utilizzata per testare i modelli personalizzati "403.html", "404.html" e "500.html"; assicurati di impostare DEBUG = False nelle impostazioni del progetto o il framework mostrerà invece un traceback per 404 e 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
Questo non funziona. Il modello 403 può essere utilizzato solo se si aumenta PermissionDenied.
Dave Halter,

Grazie @ dave-halter, hai ragione. Ho aggiornato il mio commento per correggerlo.
Mario Orlandi,

2

Prova in questo modo, inviando un messaggio con errore

from django.core.exceptions import PermissionDenied
raise PermissionDenied("You do not have permission to Enter Clients in Other Company, Be Careful")
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.