2016-09-08 4 views
1

を「作成」私は、次のビューセットがあります見られるようにDjangoの残りのフレームワークビューセットの権限は、「リスト」なし

class ActivityViewSet(viewsets.ModelViewSet): 
    queryset = Activity.objects.all() 
    serializer_class = ActivitySerializer 

    def get_permissions(self): 
     if self.action in ['update','partial_update','destroy','list']: 
      self.permission_classes = [permissions.IsAdminUser,] 
     elif self.action in ['create']: 
      self.permission_classes = [permissions.IsAuthenticated,] 
     else : 
      self.permission_classes = [permissions.AllowAny,] 
     return super(self.__class__, self).get_permissions() 

を、イムは、認証のために、「リスト」を許可せずに「作成」メソッドを許可しようとしていますユーザー(これは管理者ではありません)。 奇妙なことに、このビューセットは認証済みユーザーの作成もリストも作成しません。 Iv'eはちょうどオフルイに、次のコードをチェック:私は必要ないので

class RouteOrderingDetail(mixins.CreateModelMixin, 
        mixins.RetrieveModelMixin, 
        mixins.DestroyModelMixin, 
        mixins.UpdateModelMixin, 
        viewsets.GenericViewSet): 
    queryset = RouteOrdering.objects.all() 
    serializer_class = RouteOrderingSerializer 

このは、リストの作成ではなく、そこにある、ビューに対して許可(ただし、私のためにその使用できませんでした。avilable listオプション

希望の問題がクリアされている任意の助けがにappriciatedされます

+1

チェックhttp://www.django-rest-framework.org/api-guide/permissions /#custom-permissions –

+0

コードではっきりとわかるように、私はカスタム権限を作成しました。問題はこれを超えています。 – idik

+0

カスタム権限クラスを作成していません。ビューセットの 'get_permissions'メソッドを編集しました。カスタムアクセス権クラスでは、 'request.method'に応じてアクセス権を返すことができます –

答えて

1

たぶん、あなたはこれを試すことができます。。

class NotCreateAndIsAdminUser(permissions.IsAdminUser): 

    def has_permission(self, request, view): 
     return (view.action in ['update','partial_update','destroy','list'] 
       and super(NotCreateAndIsAdminUser, self).has_permission(request, view)) 


class CreateAndIsAuthenticated(permissions.IsAuthenticated): 

    def has_permission(self, request, view): 
     return (view.action is 'create' and 
       super(CreateAndIsAuthenticated, self).has_permission(request, view)) 

class NotSaftyMethodAndAllowAny(permissions.AllowAny) 

    def has_permission(self, request, view): 
     return (view.action is not in ['update','partial_update','destroy','list', 'create'] 
       and super(NotSaftMethodAndAllowAny, self).has_permission(request, view)) 


class ActivityViewSet(viewsets.ModelViewSet): 
    queryset = Activity.objects.all() 
    serializer_class = ActivitySerializer 
    permission_classes = (NotCreateAndIsAdminUser, CreateAndIsAuthenticated, NotSaftyMethodAndAllowAny) 

    def create(self, request): 
     pass 

    def list(self, request): 
     pass 
    .... 

参照:Allow separate permissions per View in ViewSet

また、あなたは、このように行うことができます Separate permissions per methods

それとも

、あなたに非常に似ているこの質問をチェックアウトする場合があります:

class ActivityViewSet(viewsets.ModelViewSet): 
    queryset = Activity.objects.all() 
    serializer_class = ActivitySerializer 

    def get_permissions(self): 
     if self.action in ['update','partial_update','destroy','list']: 
      # which is permissions.IsAdminUser 
      return request.user and request.user.is_staff 
     elif self.action in ['create']: 
      # which is permissions.IsAuthenticated 
      return request.user and is_authenticated(request.user)    
     else : 
      # which is permissions.AllowAny 
      return true 
+0

'permission_classes'デコレータは機能ビューでしか使用できないと思います。 – adamfc

+0

はまだ動作しません。 permission_class: "@permission_classes((IsAdmin、))"をリストに追加した後、認証されたユーザーに対して '作成'アクションは使用できません。 – idik

+0

@idik実際、adamfcさんのコメントは間違いです。 ** def get_permissions()**メソッドをオーバーライドして、あなたのアイデアが正しいと思います。ただし、少し異なる方法で実装する必要があります。 –

1

私はこれがすでに解決されていることを認識していますが、OPSに合った場合に備えて私の実装を共有したいと思いますSEの場合、または他の誰かの:

from rest_framework.authentication import TokenAuthentication, SessionAuthentication 
from rest_framework.permissions import IsAuthenticated, AllowAny 
from rest_framework.viewsets import ReadOnlyModelViewSet 

from ..models import MyModel 
from .serializers import MyModelSerializer 


class ActionBasedPermission(AllowAny): 
    """ 
    Grant or deny access to a view, based on a mapping in view.action_permissions 
    """ 
    def has_permission(self, request, view): 
     for klass, actions in getattr(view, 'action_permissions', {}).items(): 
      if view.action in actions: 
       return klass().has_permission(request, view) 
     return False 


class MyModelViewSet(ReadOnlyModelViewSet): 
    serializer_class = MyModelSerializer 
    queryset = MyModel.objects.all() 

    permission_classes = (ActionBasedPermission,) 
    action_permissions = { 
     IsAuthenticated: ['update', 'partial_update', 'destroy', 'list', 'create'], 
     AllowAny: ['retrieve'] 
    } 

    authentication_classes = (TokenAuthentication, SessionAuthentication) 

うまくいけば、このヘルプの誰かアウト:)カスタム権限を作成する方法

関連する問題