django 显示 500 错误而不是 403 错误

django shows 500 error instead of 403 error

我试图编写自定义错误页面并遇到了这个问题,当用户未通过身份验证并尝试访问特定网页时,我返回 PermissionDenied() 处理程序以显示 403(我期望的)但是,django 显示而是 500 错误。在这种情况下如何显示 403 错误?

我的urls.py:

handler404 = 'error.views.error_404'
handler403 = 'error.views.error_403'
handler500 = 'error.views.error_500'
handler400 = 'error.views.error_400'

我的 views.py 验证用户:

if request.user.is_authenticated():
    return render(request,"app/index.html")
else:
    return PermissionDenied()

我的views.py用于处理异常:

def error_404(request, exception):
    data = {}
    return render(request,'error/404.html', data)

def error_403(request, exception):
    data = {}
    return render(request,'error/403.html', data)

def error_500(request):
    data = {}
    return render(request,'error/500.html', data)

def error_400(request, exception):
    data = {}
    return render(request,'error/400.html', data)

使用的参考:How do I raise a Response Forbidden in django

你应该提出PermissionDenied [Django-doc]作为例外,所以:

if request.user.is_authenticated():
    return render(request,"app/index.html")
else:
    <b>raise</b> PermissionDenied()

或者你可以return一个HttpResponseForbidden [Django-doc]:

from django.http import HttpResponseForbidden

if request.user.is_authenticated():
    return render(request,"app/index.html")
else:
    return <b>HttpResponseForbidden()</b>

但是你不能合并这两个并且return一个PermissionDenied,或者raise一个HttpResponseForbiddenPermissionDenied是一个例外,而HttpResponseForbidden 是 HTTP 响应。