如何在django中提出禁止响应

oco*_*tts 158 django

我想做以下事情:

raise HttpResponseForbidden()
Run Code Online (Sandbox Code Playgroud)

但我得到错误:

exceptions must be old-style classes or derived from BaseException, not HttpResponseForbidden
Run Code Online (Sandbox Code Playgroud)

我该怎么做?

Chr*_*ris 363

如果你想提出一个例外,你可以使用:

from django.core.exceptions import PermissionDenied

def your_view(...):
    raise PermissionDenied()
Run Code Online (Sandbox Code Playgroud)

它记录在这里:

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

相对于returing HttpResponseForbidden,提高PermissionDenied导致使用呈现的错误403.html模板,或者您可以使用中间件来显示自定义"紫禁城"的看法.

  • @Flimm:这会在中间件级别自动触发403,允许您显示自定义的"禁止"视图. (3认同)
  • 我们可以在PermissionDenied中添加自定义消息吗? (2认同)
  • 杰克,是的,你可以 - 做类似的事情:提高PermissionDenied("没有登录用户") (2认同)
  • 不确定这是否重要,但文档说“抛出 PermissionDenied”不是函数调用,末尾没有“()”。 (2认同)
  • 使用它比HttpResponseForbidden有什么好处? (2认同)

Ign*_*ams 170

您可以像查看任何其他响应一样从视图中返回它.

from django.http import HttpResponseForbidden

return HttpResponseForbidden()
Run Code Online (Sandbox Code Playgroud)

  • 为什么存在异常类`Http404`而不是'Http403`?为什么不一致? (27认同)
  • 实际上使用`raise PermissionDenied`的优点是可以让你显示自定义的403视图 (13认同)

Mar*_*ndi 11

您可以选择提供名为"403.html"的自定义模板来控制403 HTTP错误的呈现.

正如@ 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)
Run Code Online (Sandbox Code Playgroud)

  • 这是行不通的。仅当引发PermissionDenied时才能使用403模板。 (2认同)

小智 5

尝试这种方式,发送错误消息

from django.core.exceptions import PermissionDenied
raise PermissionDenied("You do not have permission to Enter Clients in Other Company, Be Careful")
Run Code Online (Sandbox Code Playgroud)