【发布时间】:2012-05-06 19:16:32
【问题描述】:
情况很简单: 我正在编写一个多用户博客系统。系统应防止非所有者编辑或删除博客文章。在我看来,我使用通用视图。
类博客更新视图(更新视图): ...
我知道我应该使用@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 在这里不起作用。但是解决这个问题的方法是什么?
更新解决方案:
在 dispatch 方法中,我检查用户权限,如果用户不满足权限,则返回 HttpResponseForbidden()。
【问题讨论】:
-
您可以在
get_object方法中查看您的权限。使用 CBV 的装饰器看起来不太好。 -
所以你的意思是没有简单的方法将对象级装饰器应用于基于类的通用视图? @ilvar
-
我的意思是在
get_object中做起来会更容易。为了让它更干燥,你可以用get_object制作一个 Mixin 并使用它。 -
嗨,ilvar,您能举个例子吗?比如我想写一个博客updateview,在get_object中如果我发现request.user不是blog.author,我应该返回什么来引发403错误?谢谢@Daniel Roseman
标签: django django-views django-permissions