单个视图的基于 Django REST 框架组的权限

Posted

技术标签:

【中文标题】单个视图的基于 Django REST 框架组的权限【英文标题】:Django rest framework group based permissions for individual views 【发布时间】:2017-12-30 00:27:53 【问题描述】:

我正在使用 DRF 来编写 API。我想为模型视图集中的每个视图赋予不同的权限。我有两组(客户和员工)。我在 permissions.py 中将它们过滤为 Isstaff 和 Iscustomer。

class Iscustomer(permissions.BasePermission):
    def has_permission(self, request, view):
        if request.user and request.user.groups.filter(name='customers'):
            return True
        return False


class Isstaff(permissions.BasePermission):
    def has_permission(self, request, view):
        if request.user and request.user.groups.filter(name='staff'):
            return True
        return False

我正在尝试使用 get_permissions 方法覆盖。 当我在self.permission_classes 中放置一个组时,它工作正常。

class cityviewset(viewsets.ModelViewSet):
    queryset = city.objects.all()
    serializer_class = citySerializer

    def get_permissions(self):    
        if self.request.method == 'POST' or self.request.method == 'DELETE':
            self.permission_classes = [Isstaff]
        return super(cityviewset, self).get_permissions()

但是,当我尝试将多个组放入 self.permission_classes 时,它失败了。

def get_permissions(self):
    if self.request.method == 'POST' or self.request.method == 'DELETE':
        self.permission_classes = [Isstaff,Iscustomer,]
    return super(cityviewset, self).get_permissions()

【问题讨论】:

失败是什么意思?有错误提示吗?? 【参考方案1】:

问题是您在视图中添加了多个permission_classes。检查您的permissions 的方法是check_permissions()。如果您查看 DRF 代码,

def check_permissions(self, request):
    """
    Check if the request should be permitted.
    Raises an appropriate exception if the request is not permitted.
    """
    for permission in self.get_permissions():
        if not permission.has_permission(request, self):
            self.permission_denied(
                request, message=getattr(permission, 'message', None)
            )

当您提供多个权限类时,用户必须同时满足这两个权限。因此,登录用户必须同时是员工和客户。我认为这就是您的观点失败的原因。

【讨论】:

我已经添加了我的答案。请看一下。 抱歉回复晚了..明白..谢谢。

以上是关于单个视图的基于 Django REST 框架组的权限的主要内容,如果未能解决你的问题,请参考以下文章

Django rest 框架 api_view 与普通视图

在 api 视图方法上禁用 CSRF(django rest 框架)

如何在rest框架中为我的注册视图编写登录视图?

如何在单个帖子中更新多个实例 - django rest 框架

Django + AngularJS:没有使用普通 URL 和视图的 Django REST 框架的类 REST 端点?

python Django Rest_Framework框架 反序列化时数据校验的三种方法(图文并茂版)