对象权限函数多次触发

Moh*_*han 3 python django django-rest-framework

我正在使用 Django Rest 框架。我想为 RetrieveUpdateDestroyAPI View 授予权限类

我的权限类别:

class AssetItemPermission(permissions.BasePermission):
    def has_object_permission(self, request, view, obj):
        user = request.user
        shared_item_course = False

        is_content_author = PermissionHelper().check_permission(
            request.user, ['create_content'])

        courses = Course.objects.filter(module=obj)

        if any(obj.tenant in course.tenants.all() for course in courses):
            shared_item_course = True
        elif any(obj.status==TenantShareItemStatusValues.SHARED_TO_ALL.value for course in courses):
            shared_item_course = True

        if Enrolment.objects.filter(enrollable__in=courses, enrollee=request.user, 
                                    status=EnrolmentStatus(short_name=EnrolmentStatusValues.APPROVED.value)
                                   ).exists():
            print("Is enrolled by user")
            return True
        elif is_content_author and obj.tenant == request.user.tenant:
            print("is content author and it is in tenant")
            return True
        elif is_content_author and shared_item_course:
            print("is content author and it is in tenant share item")
            return True

        return False
Run Code Online (Sandbox Code Playgroud)

我的看法:

class AssetItemView(generics.RetrieveUpdateDestroyAPIView):
    serializer_class = AssetItemsSerializer
    permission_classes = [AssetItemPermission]

    def get_queryset(self):
        return Module.objects.filter(id=self.kwargs['pk'])
Run Code Online (Sandbox Code Playgroud)

它有效,但我看到在我的情况下权限检查被触发了 5 次:

例如,打印语句“是内容作者,位于租户中”打印了 5 次,而不是 1 次。为什么会发射 5 次?

jim*_*jim 6

第一个权限检查是查看用户是否能够访问所请求的资源。之后,将运行每个权限检查,以查看BrowsableAPIRenderer用户是否有权访问 HTTP 方法PUT、、PATCH DELETEOPTIONS,以确定呈现的模板是否应包含允许您对请求的资源执行这些操作的按钮。 。第一个权限检查是您是否拥有权限GET。当我在本地运行此命令时,我实际上看到了 6 个检查,因为 PUT 被检查了两次,尽管我不确定为什么。

print(request.method)如果您在 中添加一行,您可以看到它的实际效果has_object_permission

如果添加?format=json到 URL 末尾,或者仅添加format=json到查询字符串(如果那里有其他参数),则将强制使用JSONRenderer,这只会获取并返回数据,而无需可浏览的 API 模板。因此,不需要这些额外的权限检查来查看渲染器是否应在模板上创建这些按钮。JSONRenderer将仅对请求运行单个权限检查GET