如何通过 APIView 使用对象级别权限?

Umu*_*kun 3 django-rest-framework

我有一个权限类,用于检查 obj.account 是否等于 request.user.profile.account:

class IsOwner(permissions.BasePermission):
    def has_object_permission(self, request, view, obj):
        return request.user.profile.account == obj.account
Run Code Online (Sandbox Code Playgroud)

这是我的观点:

class ContactDetailView(APIView):
    permission_classes = (IsOwner, )

    def get(self, request, pk, format=None):
        contact = get_object_or_404(Contact, pk=pk)
        serializer = ContactSerializer(contact)

        return Response(
            serializer.data,
        )
Run Code Online (Sandbox Code Playgroud)

但我没有收到权限错误。它毫无问题地返回联系数据。

我的错误在哪里?

nev*_*ner 8

您需要check_object_permissions在响应之前调用方法:

class ContactDetailView(APIView):
    permission_classes = (IsOwner, )

    def get(self, request, pk, format=None):
        contact = get_object_or_404(Contact, pk=pk)
        serializer = ContactSerializer(contact)
        self.check_object_permissions(request, contact)

        return Response(
            serializer.data,
        )
Run Code Online (Sandbox Code Playgroud)

请注意,通用视图类已经默认调用它。但由于您不使用,因此RetrieveAPIView需要手动执行。