-->

添加对象级别权限通用视图(Add object level permission to generi

2019-07-29 03:25发布

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

类BlogUpdateView(更新视图):...

我知道我应该使用@method_decorator装饰调度方法。 然而,大多数例子只是@method_decorator(login_required)或模型级别的权限。 如何申请对象级别的权限检查request.user是否是这个博客帖子的作者吗? 例如,我试图用Django的权威应用,我有一个BlogPermission类文件。 我试图定义这个类如方法

def blog_edit(self, ??, ??)

我应该把这个方法?

然后调用此类似: @method_decorator(permission_required('blog_permission.blog_edit(???)'))

我应该怎么过会在这里?

更新:后读method_decorator代码,我发现它只能接受功能,无需论证。 我想这就是为什么permission_required不在这里工作了。 但是,什么是工作都是围绕这件事吗?

更新的解决方案:

在调度方法,我检查用户权限,然后返回HttpResponseForbidden()如果用户不符合许可。

Answer 1:

您可以使用基于类的视图做到这一点:

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


文章来源: Add object level permission to generic view