¿Cómo planteo una respuesta prohibida en django?

168

Me gustaría hacer lo siguiente:

raise HttpResponseForbidden()

Pero me sale el error:

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

¿Cómo debería hacer esto?

ocoutts
fuente

Respuestas:

183

Devuélvalo desde la vista como lo haría con cualquier otra respuesta.

from django.http import HttpResponseForbidden

return HttpResponseForbidden()
Ignacio Vazquez-Abrams
fuente
30
¿Por qué existe una clase de excepción Http404pero no Http403? ¿Por qué la inconsistencia?
Flimm
@Flimm stackoverflow.com/questions/3297048/… No estoy seguro acerca de Django, pero Django REST Framework tiene: desde el estado del estado de importación rest_framework.HTTP_403_FORBIDDEN 403
David Watson
15
En realidad, usar raise PermissionDeniedtiene la ventaja de permitirle mostrar su vista 403 personalizada
guival el
376

si desea plantear una excepción, puede usar:

from django.core.exceptions import PermissionDenied

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

Está documentado aquí:

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

A diferencia de la recuperación HttpResponseForbidden, el aumento PermissionDeniedocasiona que el error se procese usando la 403.htmlplantilla, o puede usar el middleware para mostrar una vista personalizada "Prohibida".

Chris
fuente
2
¿Podemos agregar un mensaje personalizado en PermissionDenied?
AJ
2
Jack, sí puedes, haz algo como: elevar PermissionDenied ("Ningún usuario conectado")
Mark Chackerian
1
No estoy seguro si importa, pero los documentos dicen que throw PermissionDeniedno como una llamada de función, sin ()el final.
Fydo
2
¿Cuál es la ventaja de usar esto sobre HttpResponseForbidden?
Flimm
3
@Flimm: esto activa automáticamente 403 en el nivel de middleware, lo que le permite mostrar su vista personalizada "Prohibida".
Orgánico dañado
11

Opcionalmente, puede proporcionar una plantilla personalizada llamada "403.html" para controlar la representación de 403 errores HTTP.

Como señaló correctamente @ dave-halter, la plantilla 403 solo se puede usar si aumenta PermissionDenied

A continuación se muestra una vista de muestra utilizada para probar plantillas personalizadas "403.html", "404.html" y "500.html"; asegúrese de establecer DEBUG = False en la configuración del proyecto o el marco mostrará un rastreo en su lugar para 404 y 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
fuente
2
Esto no funciona. La plantilla 403 solo se puede usar si aumenta PermissionDenied.
Dave Halter
Gracias @ dave-halter, tienes razón. Actualicé mi comentario para corregirlo.
Mario Orlandi
2

Pruebe de esta manera, enviando un mensaje con error

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