【发布时间】:2017-04-02 19:54:47
【问题描述】:
我是否使用 django rest 框架 (v3.4.6) 对象级权限。但是,我无法弄清楚一些事情。首先,我创建了一个自定义权限,用于检查用户是否为特定商店工作:
class Works4Shop(BasePermission):
def has_object_permission(self, request, view, obj):
profile = request.user.profile
if obj.shop in profile.shops.all():
return True
else:
return False
然后我将permission_classes = (Works4Shop,) 添加到新的自定义视图类ShopItemsView(APIView)
现在开始好奇的部分,首先我读到我需要通过调用self.check_object_permissions(request,obj) 来显式检查对象级别的权限。但是我看到的是,通过模型管理器获取任何对象都会对检索到的对象强制执行策略。不完全是,它确实调用了has_object_permission(self, request, view, obj),但它忽略了结果。问题是性能,这种事情给DB带来了很多不必要的选择。谁能解释一下?我还可以从数据库中发布日志。
【问题讨论】:
-
除了你的问题。您能解释一下为什么同时使用
profile = UserProfile.objects.get(user=request.user)和profile = request.user.profile来分配配置文件吗?我认为两者都不需要 -
我的理解是对象级别的权限旨在检查每个返回的对象是否满足这个权限条件。也许您只想要一个普通的
has_permission(),每个请求都会检查一次? -
@rrmerugu 这是我在复制代码时的一个错误。我正在尝试不同的方法来获取配置文件。
-
@serg 是的。但是,文档说明需要对
self.check_object_permissions(request,obj)的显式调用,以及如果它们返回False但后端忽略了它们的结果,检查的意义何在
标签: python django django-rest-framework