在Django REST

时间:2015-11-25 09:18:20

标签: django django-rest-framework

使用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()方法解决问题。但我不知道在知道实际对象之前如何检查权限。

2 个答案:

答案 0 :(得分:0)

这里你需要覆盖你的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 :(得分:0)

get_queryset方法已将项目列表限制为所有者是当前用户的列表。这适用于列表,但也可用于检索或更新项目。

除此之外,您不需要许可。