Django REST框架 - 同一视图中每个方法的不同权限

时间:2016-03-15 02:11:18

标签: django django-rest-framework

所以我在SO上看到了几个类似的问题,但不是我想要的。

我正在尝试在同一视图中为每个方法设置不同的权限。我目前有什么:

class MyViewSet(viewsets.ViewSet):
    # User must be authenticated
    permission_classes = (IsAuthenticated,)

    def list(self, request):
        ...

    # User must be admin
    def create(self, request):
        ...

    def retrieve(self, request):
        ...

基本上我正在努力确保只有管理员可以调用create方法。我已经看过创建自定义权限,但这适用于整个视图集,这不是我想要的。

2 个答案:

答案 0 :(得分:3)

我认为没有内置的解决方案。但是你可以通过覆盖get_permissions方法来实现这一点。

class MyViewSet(viewsets.ViewSet):

    permission_classes_by_action = {'create': [IsAdminUser]
                                    'default': [IsAuthenticated]}

    def get_permissions(self):
        try:
            # return permission_classes depending on `action` 
            return [permission() for permission in self.permission_classes_by_action[self.action]
        except KeyError: 
            # action is not set return default permission_classes
            return [permission() for permission in self.permission_classes_by_action['default']]

答案 1 :(得分:0)

也许你可以这样做

def create(self, request):
    if request.user.is_superuser:
        ....