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?

Respostas:


183

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

from django.http import HttpResponseForbidden

return HttpResponseForbidden()

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.


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)

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")
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.