2017-01-05 3 views
2

aufgerufen Ich habe ein Viewset SampleViewSet für API POST/api/samples/sample_id/check. Ich habe dafür eine Berechtigung auf Objektebene definiert.has_object_permission ist nicht für benutzerdefinierte API

class SamplePermission(BasePermission): 
    def has_object_permission(self, request, view, obj): 
     return True 

class SampleViewSet(viewsets.ModelViewSet): 
    permission_classes = (SamplePermission,) 

    @detail_route(methods=['post']) 
    def check(self, request, pk=None): 
     if pk: 
      print "check" 

Die Funktion has_object_permission nicht aufgerufen wurden, wenn ich rufe die API POST/api/samples/check. Was könnte der Grund sein?

Antwort

1

Berechtigung ist nicht funktionieren, weil eine Methode check_object_permissions in get_object Funktion ruft. So sollten Sie eine jener Funktionen aufrufen in Ihrer check Funktion:

@detail_route(methods=['post']) 
    def check(self, request, pk=None): 
     obj = self.get_object() 
     .... 

Oder Sie könnten Berechtigungen hinzufügen direkt in detail_route

@detail_route(
    permission_classes=[SamplePermission], 
    methods=['post']) 
    def check(self, request, pk=None): 
     ... 
+0

Edited die Frage nach Ihren Kommentar. Die Funktion wird für GET api aufgerufen. Es funktioniert nicht für eine benutzerdefinierte API. – linuxfreak

+0

@linuxfreak Antwort aktualisiert –

+0

Ich habe Berechtigungen direkt in detail_route hinzugefügt. Ich habe sowohl has_permission als auch has_object_permission in Sample Permission definiert. 'has_permission' wird aufgerufen, während 'has_object_permission' nicht aufgerufen wird. – linuxfreak

Verwandte Themen