视图集的自定义权限

时间:2016-09-06 15:47:14

标签: django django-views django-rest-framework http-method

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

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:按方法排序权限。 (上面的代码不起作用"请求"未被识别)

无法在"自定义权限"中找到任何用途。文档的一部分,但也许我只是盲目。 (重写BasePermission?怎么样?谁?在哪里?)

谢谢:)

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:0)

在同一问题上花费了一些钱。这是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是一个列表。