所以我有一个模型,我正在做一个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
。
有没有一种简单的方法可以实现我想要的目标,还是我要解决这个错误?
原来我弄错了。权限检查仅发生一次,并且在请求期间非常早。
就我而言,问题在于信号处理程序执行PATCH
请求。当时我还不知道,那个模型上还有另一个信号处理程序,在某个时候可以做到instance.save()
。这导致我的信号处理程序运行两次,这显然在第二个请求上导致了403。
合并信号处理程序(没有理由同时存在)后,一切都将正常运行。希望这对以后的人有所帮助!
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句