所以我有一个模型,我正在通过一个视图进行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
。
有没有一种简单的方法可以实现我想要的,或者我是否接近这个错误?
答案 0 :(得分:0)
事实证明我错了。在请求期间,权限检查只发生一次且非常早。
就我而言,问题在于信号处理程序执行<% if $MostViewedBlogPosts %>
<ul>
<% loop $MostViewedBlogPosts %>
<li><a href="$Link">$Title</a></li>
<% end_loop %>
</ul>
<% end_if %>
请求。当时我不知道,该模型上有另一个信号处理程序,在某些时候PATCH
。这导致我的信号处理程序运行两次,这在第二个请求上显然导致403。
在组合信号处理程序(没有两者存在的理由)之后,一切都完美无瑕。希望这可以帮助将来的某个人!