在Django REST中获取对象之前检查权限

使用Django REST框架,我使用此视图和权限只允许项目所有者获取他们的项目.

view.py

class ProjectViewSet(viewsets.ModelViewSet):
    permission_classes = (
       IsProjectOwner,permissions.IsAuthenticated,)

    def get_queryset(self):
       return Project.objects.filter(owner=self.request.user)

permissions.py

class IsProjectOwner(permissions.BasePermission):
    def has_object_permission(self,request,view,obj):
        return obj.owner == request.user

用户试图获得不属于他的项目时,会出现HTTP 404.但是,我想获得HTTP 403_Forbidden.这是我使用的测试

def test_auth_get(self):
        self.client.credentials(
            HTTP_AUTHORIZATION=self.authenticated_user_token
            ) 

        response = self.client.get(
            '/-/projects/%s/' % self.project_owner_project_id
            )

        self.assertEqual(response.status_code,status.HTTP_403_FORBIDDEN)

我尝试使用像REST文档http://www.django-rest-framework.org/api-guide/permissions/#object-level-permissions中的get_object()方法解决问题.但我不知道如何在知道实际对象之前检查权限.

解决方法

在这里,你需要覆盖你的get_queryset方法;
实际上,您从get_queryset方法传递的查询集中查看查找对象.

def get_queryset(self):
    if self.action == 'update':
        return Project.objects.filter(owner=self.request.user)
    else:
        return Project.objects.all()

相关文章

功能概要:(目前已实现功能)公共展示部分:1.网站首页展示...
大体上把Python中的数据类型分为如下几类: Number(数字) ...
开发之前第一步,就是构造整个的项目结构。这就好比作一幅画...
源码编译方式安装Apache首先下载Apache源码压缩包,地址为ht...
前面说完了此项目的创建及数据模型设计的过程。如果未看过,...
python中常用的写爬虫的库有urllib2、requests,对于大多数比...