DRF Viewset удалить разрешение для подробного маршрута - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть базовый набор:

class UsersViewSet(viewsets.ModelViewSet):
    permission_classes = (OnlyStaff,)
    queryset = User.objects.all()
    serializer_class = UserSerializer

Это привязка к конечной точке /api/users/.Я хочу создать страницу профиля пользователя, поэтому мне нужен только конкретный пользователь, чтобы я мог получить ее из /api/users/<id>/, но проблема в том, что я хочу, чтобы /api/users/<id>/ был разрешен для всех, но /api/users/ оставил егоразрешение OnlyStaff, так что никто не может иметь доступ к полному списку пользователей.

Примечание: Возможно, это не очень хорошая реализация, так как кто-нибудь может грубо заставить данные увеличивать id, но яЯ готов изменить его с <id> на <slug>.

Как удалить разрешение из подробного маршрута?

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 28 сентября 2018

Переопределите метод get_permissions(), как показано ниже

<b>from rest_framework.permissions import AllowAny</b>


class UsersViewSet(viewsets.ModelViewSet):
    permission_classes = (OnlyStaff,)
    queryset = User.objects.all()
    serializer_class = UserSerializer

    <b>def get_permissions(self):
        if self.action == 'retrieve':
            return [AllowAny(), ]        
        return super(UsersViewSet, self).get_permissions()</b>
0 голосов
/ 27 сентября 2018

Было бы полезно, если бы вы опубликовали класс разрешений.

Но если оставить в стороне то, что вы опубликовали, похоже, что только пользователи-сотрудники могут иметь доступ к конечным точкам, привязанным к этому набору представлений.То есть никакой другой тип / роль пользователя не может получить доступ к этим конечным точкам

Отходя от вашего вопроса, кажется, что вы хотите установить разрешение IsOwnerOrStaffOrReadOnly и переопределить функцию списка маршрутизации ModelViewSet, а также заменить license_classes и затем вызвать super

class UsersViewSet(viewsets.ModelViewSet):
    permission_classes = (IsOwnerOrStaffOrReadOnly,)
    queryset = User.objects.all()
    serializer_class = UserSerializer

def list(self, request, *arg, **kwargs):
   self.permission_classes = (OnlyStaffCanReadList,)
   super(UsersViewSet, self).list(request, *args, **kwargs)  // python3 super().list(request, *args, **kwargs)

для объекта Owner.класс разрешений

class IsOwnerOrStaffOrReadOnly(permissions.BasePermission):

    def has_object_permission(self, request, view, obj):
        # Read permissions are allowed to any request,
        # so we'll always allow GET, HEAD or OPTIONS requests.
        if request.method in permissions.SAFE_METHODS:
            return True

        if request.user.role == 'staff': 
           return True
        # Instance must have an attribute named `owner`.
        return obj.owner == request.user

только сотрудники могут читать класс разрешений

class OnlyStaffCanReadList(permissions.BasePermission):

    def has_object_permission(self, request, view, obj):
        if request.user.role == 'Staff': 
           return True
        else:
           return False

, как указано в комментариях, ваша пользовательская модель должна иметь роль владельца.если вы используете модель пользователя django, вы можете просто сделать obj.id == request.user.id сравнение

...