Django REST框架检查不必要的权限

时间:2017-04-02 19:54:47

标签: python django django-rest-framework

我是否使用django rest framework(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有很多不必要的选择。有谁能解释一下?我也可以从数据库发布日志。

1 个答案:

答案 0 :(得分:0)

所以答案比我想象的要简单得多。基本上只有在使用可浏览API时才会出现此问题。在渲染模板期间,有许多模板标签用于使用View类中指定的每种请求(post,put,delete等)的表单,并且单独检查每个表单的对象权限。当我使用纯json格式时,一切都开始工作,没有不必要的检查等。

但是有一个问题。可浏览的api会检查所提取的每个对象的权限,这反过来又会产生问题:您不知道has_object_permission(self, request, view, obj)中的obj类是什么,因此您应该进行明确检查,否则APIView将抛出{{ 1}}