在`(object)-detail` URLS中根本没有调用has_object_permission

时间:2015-06-27 12:23:48

标签: python django django-rest-framework

我遇到一个问题,has_object_permission()被忽略了。即使我使用登录的正确用户访问http://127.0.0.1:8000/portfolios/3/,它仍然默认为has_permission()。我做错了吗?

ViewSet类:

class PortfolioViewSet(viewsets.ModelViewSet):
    queryset = Portfolio.objects.all()
    serializer_class = serializers.PortfolioSerializer
    permission_classes = (permissions.IsPortfolioOwner, )

许可类别:

class IsPortfolioOwner(permissions.BasePermission):

    # Details
    def has_object_permission(self, request, view, obj):
        print("Checking for object")

        ruser = request.user
        if ruser is None:
            return False
        elif ruser == obj.client.user:
            return True

    def has_permission(self, request, view):
        print("Checking for list")
        return request.user.is_superuser

1 个答案:

答案 0 :(得分:0)

为了检查has_object_permissionhas_permission必须返回True。如果它返回False,则权限检查将短路,请求将被拒绝。

您当前的权限类只允许用户查看列表(如果他们是超级用户)。并且在查看当前用户对象的超级用户下无法查看单个对象。