视图集的自定义权限

Custom permissions on viewset

我正在尝试找到一种在视图集上创建自定义权限的方法。 我想实现这样的东西:

class ActivityViewSet(viewsets.ModelViewSet):
    queryset = Activity.objects.all()
    serializer_class = ActivitySerializer
    if request.method == 'PUT':
        permission_classes = (permissions.IsOwner)
    elif request.method == 'LIST':
        permission_classes = (permissions.IsAdmin)
    else :
        permission_classes = (permissions.AllowAny)

IE:按方法排序权限。 (上面的代码不起作用,因为 "request" 未被识别)

在文档的 "Custom permissions" 部分找不到任何用途,但也许我只是瞎了眼。 (覆盖 BasePermission?如何?谁?在哪里?)

谢谢:)

视图集使用 action 来确定从 get_permissions 方法调用的 HTTP 动词和权限,因此您可以覆盖它:

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

    def get_permissions(self):
        if self.action == 'update':
            return IsOwner()
        elif self.action == 'list':
            return IsAdminUser()
        else :
            return AllowAny()

在同一个问题上花费了一些钱。这是 DRF 3+

的解决方案
class ActivityViewSet(viewsets.ModelViewSet):
"""ViewSet for viewing and editing client's accounts."""
queryset = Activity.objects.all()
serializer_class = ActivitySerializer

def get_permissions(self):
    """Set custom permissions for each action."""
    if self.action in ['update', 'partial_update', 'destroy', 'list']:
        self.permission_classes = [IsAuthenticated, ]
    elif self.action in ['create']:
        self.permission_classes = [AllowAny, ]
    return super().get_permissions()

确保 permission_classes 是一个列表。