Django 向常规视图添加对象级权限

Django 向常规视图添加对象级权限,django,django-views,django-permissions,Django,Django Views,Django Permissions,情况很简单: 我正在写一个多用户博客系统。系统应防止非所有者编辑或删除博客文章。在我看来,我使用通用视图 类BlogUpdateView(UpdateView): 我知道我应该使用@method\u decorator来装饰分派方法。然而,大多数示例只是@method\u decorator(需要登录)或模型级权限。如何应用对象级权限检查request.user是否是此博客文章的作者? 例如,我尝试使用django authority应用程序,我在这个文件中有一个BlogPermission类

情况很简单: 我正在写一个多用户博客系统。系统应防止非所有者编辑或删除博客文章。在我看来,我使用通用视图

类BlogUpdateView(UpdateView):

我知道我应该使用@method\u decorator来装饰分派方法。然而,大多数示例只是@method\u decorator(需要登录)或模型级权限。如何应用对象级权限检查request.user是否是此博客文章的作者? 例如,我尝试使用django authority应用程序,我在这个文件中有一个BlogPermission类。我试图在这个类中定义一个方法

def blog\u编辑(self、?、?)

我应该在这个方法中加入什么

然后把这个叫做:
@method\u decorator(需要权限('blog\u permission.blog\u edit(?)))

我应该在这里通过什么

更新:在阅读了方法装饰器代码之后,我发现它只能接受没有参数的函数。我想这就是为什么需要许可在这里不起作用。但这方面的工作是什么

更新解决方案:


在dispatch method中,我检查用户权限,如果用户不符合权限,则返回HttpResponseForbidden()。

您可以使用基于类的视图执行此操作:

class BlogEdit(UpdateView):
    model = Blog

    def dispatch(self, request, *args, **kwargs):
        if not request.user.has_perm('blog_permission.blog_edit'):
            return HttpResponseForbidden()
        return super(BlogEdit, self).dispatch(request, *args, **kwargs)

    # OR (for object-level perms)

    def get_object(self, *args, **kwargs):
        obj = super(BlogEdit, self).get_object(*args, **kwargs)
        if not obj.user == self.request.user:
            raise Http404 # maybe you'll need to write a middleware to catch 403's same way
        return obj

您可以在
get\u object
方法中检查您的权限。装饰器在CBV中看起来不太好。所以你的意思是没有简单的方法将对象级装饰器应用于基于类的泛型视图@ilvarI意味着在
get\u object
中更容易实现。为了让它更干燥,你可以用
get_object
制作一个Mixin并使用它。嗨,ilvar,你能举个例子吗?比如如果我想写一个blog updateview,如果我发现request.user不是blog.author,我应该返回什么来引发403错误?谢谢@Daniel Rosemann可以引发内置异常
django.core.exceptions.PermissionDenied
以显示来自
get\u object
的403错误页面。然后,您可以自定义
403.html
模板中的错误,或者在URLconf中使用
handler403
覆盖视图(请参阅)。不幸的是,您无法通过异常传递消息,并且模板上下文没有通过内置行为传递原始异常。如果您想显示一条特殊的消息,您需要创建中间件。