Django REST - 拒绝读取ListAPIView的访问权限

时间:2017-02-08 19:18:26

标签: django permissions django-rest-framework

我正在尝试熟悉djangorestframework的权限设置。作为其中的一部分,我正在尝试建立一个概念验证,以基于函数的响应拒绝所有访问(包括读取访问)并确保它被拒绝。 (基本上确保在我认为它应该被使用时使用该函数。)我有RetrieveAPIViewListAPIView设置相同。 Retrieve拒绝访问,但List允许访问,我正在试图找出存在差异的原因。

# in views.py
class TableList(generics.ListAPIView):
    queryset = MyModel.objects.all()
    serializer_class = MySerializer
    permission_classes = (RejectAll,)

class TableDetail(generics.RetrieveAPIView):
    queryset = MyModel.objects.all()
    serializer_class = MySerializer
    permission_classes = (RejectAll,)


# in permissions.py
class RejectAll(permissions.BasePermission):
    def has_object_permission(self, request, view, obj):
        return False  # for proof of concept -- this should always block all access?


# in settings.py
...

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    )
}


# in serializers.py
class MySerializer(serializers.ModelSerializer):
    class Meta:
        model = SolarData
        fields = (...)

我知道我可以创建一个调用get_object()的{​​{1}}方法,但这不会破坏设置self.check_object_permissions(self.request, obj)的目的吗?通用视图不应该自己执行相同的检查吗?

编辑/澄清:通过读访问我当然意味着GET方法。

1 个答案:

答案 0 :(得分:1)

发布后立即找到答案。显然,还有has_permission()函数与我使用的has_object_permission()分开。所以permissions.py变为:

# permissions.py
class RejectAll(permissions.BasePermission):
    def has_permission(self, request, view):
        return False

现在按预期工作。