2016-09-08 4 views
1

Ich habe folgendes Viewset:Django übriges Rahmen Viewset Berechtigungen „erstellen“ ohne „Liste“

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() 

Wie man sieht, Im Versuch, die ‚create‘ Methode zu ermöglichen, ohne dass die ‚Liste‘, für einen authentifizierten Benutzer (der kein Administrator ist). Seltsamerweise führt dieses Viewset zu keiner Erstellung oder Liste für den authentifizierten Benutzer. Iv'e geprüft, nur um rull aus, den folgenden Code:

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

Diese für eine Ansicht erlaubt hat, in der es schaffen, aber nicht Liste (aber es ist nicht geeignet für mich, da brauche ich . avilable die Liste Option

Hoffnung das Problem ist klar Jede Hilfe wird appriciated

+1

prüfen, wie Sie benutzerdefinierte Berechtigungen erstellen http://www.django-rest-framework.org/api-guide/permissions/# custom-permissions –

+0

Ich habe benutzerdefinierte Berechtigungen, wie Sie deutlich im Code sehen können. Das Problem ist darüber hinaus. – idik

+0

Sie haben keine benutzerdefinierte Berechtigungsklasse erstellt. Sie haben die 'get_permissions'-Methode in Ihrem Viewset bearbeitet. Mit einer benutzerdefinierten Berechtigungsklasse können Sie Berechtigungen abhängig von 'request.method' zurückgeben. –

Antwort

1

Vielleicht können Sie versuchen, diese:..

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 
    .... 

die Referenzen: Allow separate permissions per View in ViewSet

auch, Sie könnten diese Fragen prüfen wollen, die Ihnen sehr ähnlich ist, Separate permissions per methods

Oder

Sie so tun können:

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

Ich glaube, dass die 'Permission_Classes' Decorator kann nur auf funktionale Ansichten verwendet werden. – adamfc

+0

wird immer noch nicht funktionieren. Nach dem Hinzufügen einer permission_class: "@permission_classes ((IsAdmin,))" für die Liste, ist die Aktion 'create' für die authentifizierten Benutzer nicht verfügbar. – idik

+0

@idik eigentlich, adamfcs Kommentar ist richtig, sorry für meinen Fehler. Stellt sich heraus, Ihre Idee ist richtig, überschreiben Sie Ihre ** def get_permissions() ** Methode. Sie müssen es jedoch etwas anders implementieren. –

1

Ich weiß, dass dies bereits beantwortet wurde, wollte aber meine Implementierung teilen, falls es besser zu den OPS passt se Fall oder jemand anderes:

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) 

Hoffentlich Hilfe jemand aus :)

Verwandte Themen