gpt4 book ai didi

django - 向通用 View 添加对象级别权限

转载 作者:行者123 更新时间:2023-12-02 11:50:02 27 4
gpt4 key购买 nike

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

类 BlogUpdateView(UpdateView):...

我知道我应该使用@method_decorator来装饰调度方法。但是,大多数示例只是 @method_decorator(login_required) 或模型级别权限。如何应用对象级权限来检查request.user是否是这篇博文的作者?例如,我尝试使用 django-authority 应用程序,并且此文件中有一个 BlogPermission 类。我尝试在此类中定义一个方法,例如

def blog_edit(self, ??, ??)

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

然后这样调用它:@method_decorator(permission_required('blog_permission.blog_edit(???)'))

我应该在这里传递什么?

更新:阅读method_decorator代码后,我发现它只能接受不带参数的函数。我认为这就是permission_required 在这里不起作用的原因。但这有什么解决办法呢?

更新解决方案:

在调度方法中,我检查用户权限,如果用户不满足权限,则返回 HttpResponseForbidden()。

最佳答案

您可以使用基于类的 View 来做到这一点:

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

关于django - 向通用 View 添加对象级别权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10326938/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com