Django Разрешения Rest Framework не вызываются для просмотра деталей и списков - PullRequest
0 голосов
/ 11 февраля 2020

Я создал этот пользовательский класс разрешений, и он, кажется, не вызывается, когда я делаю запрос из представления. Я установил событие так, чтобы оно возвращало false, и запросы все еще успешны. Попытка размещения оператора печати, чтобы увидеть, будет ли вывод, но нет. Не уверен, что я делаю wring.

Просмотр:

class EventEditView(RetrieveUpdateDestroyAPIView):
    authentication_classes = (SessionAuthentication, JSONWebTokenAuthentication,  )
    permission_classes = (EventVisibilityPerm, )
    serializer_class = EventEditSerializer

    def get(self, request, *args, **kwargs):
        event = get_object_or_404(Event, slug=kwargs['slug'])
        serializer = EventSerializer(event)
        return Response(serializer.data)

Permissions.py:

class EventVisibilityPerm(permissions.BasePermission):
    """
    Permission class determines whether a user has access to a specific Event
    """

def has_object_permission(self, request, view, obj):
    user = request.user
    if obj.user == user:
        return True

** Сериализатор: **

class EventSerializer(serializers.ModelSerializer):
    class Meta:
        model = Event
        exclude = ('user', 'id')

В настоящее время проверяются разрешения для этого подробного представления, но это разрешение также необходимо будет использовать в представлении списка.

Ответы [ 2 ]

3 голосов
/ 11 февраля 2020

Вы ДОЛЖНЫ реализовать метод has_permission(self, request, view) при создании пользовательских классов разрешений .

Из DRF Do c,

Метод уровня has_object_permission будет только вызывается, если проверки уровня просмотра has_permission уже пройдены.

Пример:

from rest_framework import permissions


class EventVisibilityPerm(permissions.BasePermission):
    <b>def has_permission(self, request, view):
        """
        allowing users with specific email ids
        """
        if request.user.email in EMAIL_WHITELIST:
            return True
        return False</b>

    def has_object_permission(self, request, view, obj):
        """
        allowing users those who are the owner of the object (obj.user)
        """
        return request.user == obj.user
0 голосов
/ 11 февраля 2020

Вы можете переопределить две функции для класса разрешений, которые вы наследуете от BasePermission. эти функции has_permission и has_object_permission. has_permission проверяется автоматически. но, на ваш взгляд, функцию has_object_permission следует вызывать вручную с кодом ниже:

self.check_object_permissions(self.request, obj)
...