2017-04-02 59 views
0

我是否使用django rest框架(v3.4.6)对象级权限。但是,我无法弄清楚几件事情。首先,我创建如果用户在一家特定的商店,检查自定义权限:Django REST框架检查不必要的权限

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。任何人都可以解释吗?我也可以从数据库中发布日志。

+0

除了您的问题。你能解释为什么你同时使用'profile = UserProfile.objects.get(user = request.user)'和'profile = request.user.profile'来分配配置文件吗?我没有看到两者都需要 – rrmerugu

+0

我的理解是,对象级权限旨在检查每个返回的对象是否满足此权限条件。也许你只需要一个常规的'has_permission()',每个请求检查一次? – serg

+0

@rrmerugu在复制代码时,这是我的错误。我正在尝试不同的方法来获取配置文件。 – mrangry777

回答

0

所以答案比我想象的要简单。基本上这个问题只发生在使用可浏览的API时。在呈现模板期间,有许多模板标签用于使用View类(post,put,delete等)中指定的各种请求,并且单独检查每个表单的对象权限。当我使用纯json格式时,所有的东西都开始工作了,没有多余的检查等等。

然而有一个问题。可浏览的api会检查获取的每个对象的权限,这又会产生一个问题:您不知道has_object_permission(self, request, view, obj)中的obj类是什么,因此您应该进行明确的检查或者APIView将抛出TypeError