django에서 금지 된 응답을 올리려면 어떻게합니까


168

다음을 수행하고 싶습니다.

raise HttpResponseForbidden()

하지만 오류가 발생합니다.

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

어떻게해야합니까?

답변:


183

다른 응답과 마찬가지로 뷰에서 반환하십시오.

from django.http import HttpResponseForbidden

return HttpResponseForbidden()

30
왜 예외 클래스가 존재 Http404하지 Http403않습니까? 왜 불일치가 발생합니까?
Flimm

@Flimm stackoverflow.com/questions/3297048/… Django에 대해서는 잘 모르겠지만 Django REST Framework에는 rest_framework 가져 오기 상태에서 : HTTP_403_FORBIDDEN 403
David Watson

15
실제로 사용 raise PermissionDenied하면 사용자 정의 403보기를 표시 할 수 있다는 이점이 있습니다.
guival

376

예외를 제기하려면 다음을 사용할 수 있습니다.

from django.core.exceptions import PermissionDenied

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

여기에 문서화되어 있습니다.

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

returing HttpResponseForbidden과 반대로 , raise PermissionDenied403.html템플릿을 사용하여 오류를 렌더링 하거나 미들웨어를 사용하여 사용자 정의 "금지"보기를 표시 할 수 있습니다.


2
PermissionDenied에 사용자 정의 메시지를 추가 할 수 있습니까?
AJ

2
Jack, 예. 가능합니다 : raise PermissionDenied ( "No
login

1
중요한지는 확실하지 않지만 문서 는 끝에 throw PermissionDenied없이 함수 호출로 말하지 않습니다 ().
Fydo

2
HttpResponseForbidden보다 이것을 사용하면 어떤 이점이 있습니까?
Flimm

3
@Flimm : 미들웨어 수준에서 403을 자동으로 트리거하여 사용자 정의 "금지"보기를 표시 할 수 있습니다.
유기

11

403 HTTP 오류의 렌더링을 제어하기 위해 "403.html" 이라는 사용자 정의 템플리트를 선택적으로 제공 할 수 있습니다 .

@ dave-halter가 올바르게 지적했듯이 403 템플릿은 PermissionDenied를 높이는 경우에만 사용할 수 있습니다

아래는 사용자 정의 템플릿 "403.html", "404.html"및 "500.html"을 테스트하는 데 사용되는 샘플보기입니다. 프로젝트 설정에서 DEBUG = False를 설정하십시오. 그렇지 않으면 프레임 워크가 404 및 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
작동하지 않습니다. 403 템플릿은 PermissionDenied를 올린 경우에만 사용할 수 있습니다.
Dave Halter

@ dave-halter에게 감사합니다. 내 의견을 업데이트하여 수정했습니다.
마리오 올 랜디

2

이 방법으로 시도하고 오류가있는 메시지를 보내십시오.

from django.core.exceptions import PermissionDenied
raise PermissionDenied("You do not have permission to Enter Clients in Other Company, Be Careful")
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.