Django rest framework_classes метода ViewSet

Я пишу API для отдыха с использованием инфраструктуры Django REST, и я бы хотел защитить определенные конечные точки с разрешениями. Классы разрешений выглядят так, что они обеспечивают элегантный способ достичь этого. Моя проблема в том, что я хотел бы использовать разные классы разрешений для разных переопределенных методов ViewSet.

class UserViewSet(viewsets.ModelViewSet): queryset = User.objects.all() serializer_class = UserSerializer def create(self, request, *args, **kwargs): return super(UserViewSet, self).create(request, *args, **kwargs) @decorators.permission_classes(permissions.IsAdminUser) def list(self, request, *args, **kwargs): return super(UserViewSet, self).list(request, *args, **kwargs) 

В приведенном выше коде я также хотел бы разрешить регистрацию (создание пользователя) для пользователей, не прошедших проверку подлинности, но я не хочу, чтобы пользователи списков никому, как раз для персонала.

В документах я видел примеры для защиты представлений API (а не методов ViewSet) с помощью decor_classes decorator, и я видел установку классов разрешений для всего ViewSet. Но, похоже, он не работает над переопределенными методами ViewSet. Есть ли способ использовать их только для определенных конечных точек?

2 Solutions collect form web for “Django rest framework_classes метода ViewSet”

Я думаю, для этого нет встроенного решения. Но вы можете добиться этого, переопределив метод get_permissions :

 class UserViewSet(viewsets.ModelViewSet): queryset = User.objects.all() serializer_class = UserSerializer permission_classes_by_action = {'create': [AllowAny] 'list': [IsAdminUser]} def create(self, request, *args, **kwargs): return super(UserViewSet, self).create(request, *args, **kwargs) def list(self, request, *args, **kwargs): return super(UserViewSet, self).list(request, *args, **kwargs) def get_permissions(self): try: # return permission_classes depending on `action` return [permission() for permission in self.permission_classes_by_action[self.action] except KeyError: # action is not set return default permission_classes return [permission() for permission in self.permission_classes] 

Я создал суперкласс, полученный из ответа @ ilse2005. Во всех последующих представлениях django вы можете наследовать это, чтобы получить контроль над разрешением на уровне действия.

 class MixedPermissionModelViewSet(viewsets.ModelViewSet): ''' Mixed permission base model allowing for action level permission control. Subclasses may define their permissions by creating a 'permission_classes_by_action' variable. Example: permission_classes_by_action = {'list': [AllowAny], 'create': [IsAdminUser]} ''' permission_classes_by_action = {} def get_permissions(self): try: # return permission_classes depending on `action` return [permission() for permission in self.permission_classes_by_action[self.action]] except KeyError: # action is not set return default permission_classes return [permission() for permission in self.permission_classes] 
  • Разве django-rest-swagger не работает с moderializers?
  • Отключить или ограничить / o / приложения (django rest framework, oauth2)
  • Поле идентификатора модели Django Rest Framework в сериализаторе вложенных отношений
  • Получение запросов 401 в Twitter OAuth POST
  • Как исправить предупреждение об отсрочке в Django 1.9
  • django rest framework lookup_field через OneToOneField
  • osticket, создать билет через REST API
  • ImportError: нет модуля с именем flask.ext.httpauth
  • Python - лучший язык программирования в мире.