如何在Django中提出禁止响应


168

我想执行以下操作:

raise HttpResponseForbidden()

但是我得到了错误:

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

我应该怎么做?

Answers:


183

从视图中返回它,就像处理其他任何响应一样。

from django.http import HttpResponseForbidden

return HttpResponseForbidden()

30
为什么存在一个异常类Http404却不存在Http403?为什么不一致?
Flimm

@Flimm stackoverflow.com/questions/3297048/...我不知道Django的,但Django的REST框架有:从rest_framework进口状态status.HTTP_403_FORBIDDEN 403
大卫·沃森

15
实际使用raise PermissionDenied的好处是可以让您显示自定义的403视图
guival,2016年

376

如果要引发异常,可以使用:

from django.core.exceptions import PermissionDenied

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

它记录在这里:

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

与重演相反HttpResponseForbidden,升高PermissionDenied会导致使用403.html模板渲染错误,或者您可以使用中间件来显示自定义的“禁止”视图。


2
我们可以在PermissionDenied中添加自定义消息吗?
2014年

2
杰克,是的,您可以-这样做:提高PermissionDenied(“未登录用户”)
Mark Chackerian 2014年

1
不知道这是否重要,但是文档说不throw PermissionDenied作为函数调用,没有()末尾。
Fydo 2014年

2
与HttpResponseForbidden相比,使用此方法有什么优势?
Flimm

3
@Flimm:这会在中间件级别自动触发403,使您可以显示自定义的“禁止”视图。
损坏的有机

11

您可以选择提供一个名为“ 403.html”的自定义模板,以控制403 HTTP错误的呈现。

正如@ dave-halter正确指出的那样,仅当您引发PermissionDenied时,才能使用403模板

以下是用于测试自定义模板“ 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
这是行不通的。仅当您引发PermissionDenied时才能使用403模板。
戴夫·霍尔特

谢谢@ dave-halter,您是对的。我更新了我的评论以纠正它。
马里奥·奥兰迪

2

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

from django.core.exceptions import PermissionDenied
raise PermissionDenied("You do not have permission to Enter Clients in Other Company, Be Careful")
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.