Como eu levanto uma resposta proibida no django

168

Eu gostaria de fazer o seguinte:

raise HttpResponseForbidden()

Mas eu recebo o erro:

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

Como devo fazer isso?

ocoutts
fonte

Respostas:

183

Retorne-o da visualização como faria com qualquer outra resposta.

from django.http import HttpResponseForbidden

return HttpResponseForbidden()
Ignacio Vazquez-Abrams
fonte
30
Por que existe uma classe de exceção, Http404mas não Http403? Por que a inconsistência?
Flimm
@Flimm stackoverflow.com/questions/3297048/... Eu não tenho certeza sobre Django, mas Django RESTO Framework tem: de estatuto rest_framework importação status.HTTP_403_FORBIDDEN 403
David Watson
15
Na verdade usando raise PermissionDeniedtem a vantagem de permitir que você mostrar o seu costume 403 vista
guival
376

Se você deseja gerar uma exceção, pode usar:

from django.core.exceptions import PermissionDenied

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

Está documentado aqui:

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

Ao contrário da repetição HttpResponseForbidden, o aumento PermissionDeniedfaz com que o erro seja renderizado usando o 403.htmlmodelo ou você pode usar o middleware para mostrar uma visualização "Proibida" personalizada.

Chris
fonte
2
Podemos adicionar uma mensagem personalizada no PermissionDenied?
AJ
2
Jack, sim, você pode - fazer algo como: aumento PermissionDenied ( "Não usuário conectado")
Mark Chackerian
1
Não tenho certeza se isso importa, mas os documentos throw PermissionDeniednão dizem como uma chamada de função, sem a ()no final.
Fydo
2
Qual é a vantagem de usar isso em HttpResponseForbidden?
Flimm
3
@Flimm: Isso aciona automaticamente 403 no nível do middleware, permitindo que você mostre sua exibição "Proibida" personalizada.
Danificado Organic
11

Opcionalmente, você pode fornecer um modelo personalizado chamado "403.html" para controlar a renderização de erros HTTP 403.

Conforme corretamente indicado por @ dave-halter, o modelo 403 só pode ser usado se você aumentar PermissionDenied

Abaixo está uma visualização de exemplo usada para testar modelos personalizados "403.html", "404.html" e "500.html"; certifique-se de definir DEBUG = False nas configurações do projeto, ou a estrutura mostrará um retorno para 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)
Mario Orlandi
fonte
2
Isso não funciona. O modelo 403 pode ser usado apenas se você aumentar PermissionDenied.
Dave Halter
Obrigado @ dave-halter, você está certo. Eu atualizei meu comentário para corrigi-lo.
Mario Orlandi
2

Tente desta maneira, enviando mensagem com erro

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