Функция разрешения объекта срабатывает более одного раза - PullRequest
2 голосов
/ 24 июня 2019

Я использую Django Rest Framework.Я хочу предоставить класс доступа для 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

My View:

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

    def get_queryset(self):
        return Module.objects.filter(id=self.kwargs['pk'])

Это работает, но я вижу, что проверка разрешения запускается5 раз в моем случае:

Например, оператор print «является автором контента, и он принадлежит арендатору» печатает 5 раз вместо одного.Почему это стрельба 5 раз?

1 Ответ

2 голосов
/ 01 июля 2019

Первая проверка прав доступа заключается в том, чтобы убедиться, что пользователь может получить доступ к запрошенному ресурсу. После этого каждая из этих проверок разрешений запускается BrowsableAPIRenderer, чтобы проверить, имеет ли пользователь доступ к методам HTTP PUT, PATCH DELETE и OPTIONS, чтобы определить, отображается ли шаблон должны включать кнопки, которые позволят вам выполнить эти действия на запрашиваемом ресурсе. Первая проверка разрешений заключается в том, есть ли у вас разрешение GET. Когда я запускаю это локально, я на самом деле вижу 6 проверок, потому что PUT проверяется дважды, хотя я не уверен почему.

Вы можете увидеть это в действии, если добавите строку print(request.method) в has_object_permission.

Если вы добавите ?format=json в конец вашего URL-адреса или просто добавите format=json в строку запроса, если у вас есть дополнительные параметры, вы заставите использовать JSONRenderer, который будет только извлекать и возвращать данные, без просмотра API-шаблона. Таким образом, эти дополнительные проверки прав доступа не нужны, чтобы увидеть, должен ли средство визуализации создавать эти кнопки в шаблоне. JSONRenderer будет запускать только одну проверку разрешений для запроса GET.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...