是否可以在整个请求中保留权限?

时间:2016-08-09 05:40:44

标签: python django django-rest-framework

所以我有一个模型,我正在通过一个视图进行PATCH,在某些情况下可以改变我的对象,使得调用者允许进一步改变它

我的权限类看起来像这样:

class MyPermission(BasePermission):

   def has_object_permission(self, request, view, obj):
       if request.user.has_perm("can_change_when_not_done") and obj.status != "done":
           return True
       return super(MyPermission, self).has_object_permission(request, view_obj)

这可以按预期工作。

然而,似乎当我将对象修补为“完成”(例如有效负载中的{'status': 'done'})时,它会在返回的路上通过序列化程序进行另一次权限检查,从而产生403 ,因为对象现在“完成”。我仍然希望从该请求获得200和序列化视图,了解对象的样子。 未来变异请求应该产生403。

在“安全”方法(例如GET)下将对象设置为只读帮助,因为原始请求仍为PATCH

有没有一种简单的方法可以实现我想要的,或者我是否接近这个错误?

1 个答案:

答案 0 :(得分:0)

事实证明我错了。在请求期间,权限检查只发生一次且非常早。

就我而言,问题在于信号处理程序执行<% if $MostViewedBlogPosts %> <ul> <% loop $MostViewedBlogPosts %> <li><a href="$Link">$Title</a></li> <% end_loop %> </ul> <% end_if %> 请求。当时我不知道,该模型上有另一个信号处理程序,在某些时候PATCH。这导致我的信号处理程序运行两次,这在第二个请求上显然导致403。

在组合信号处理程序(没有两者存在的理由)之后,一切都完美无瑕。希望这可以帮助将来的某个人!