Django Rest框架中的人员权限

Django Rest框架中的人员权限,django,django-rest-framework,Django,Django Rest Framework,我正在尝试创建仅限于人员的Django Rest Framework模型视图集。当我尝试使用标准的Django decorator@staff\u member\u required时,我遇到了一些错误,这让我相信decorator无法与Django Rest框架一起工作 因此,我正在尝试编写自己的ModelViewSet mixin。它主要按照我想要的方式工作,除了更新方法,我不能让它工作 所以,有两个问题:有没有更优雅的方法来做到这一点,如果没有,我的更新方法有什么问题?我找不到任何关于更新

我正在尝试创建仅限于人员的Django Rest Framework模型视图集。当我尝试使用标准的Django decorator
@staff\u member\u required
时,我遇到了一些错误,这让我相信decorator无法与Django Rest框架一起工作

因此,我正在尝试编写自己的ModelViewSet mixin。它主要按照我想要的方式工作,除了更新方法,我不能让它工作

所以,有两个问题:有没有更优雅的方法来做到这一点,如果没有,我的更新方法有什么问题?我找不到任何关于更新的文档,所以我在猜测如何升级它,但它不起作用

谢谢

约翰

这是我的班级:

class StaffOnlyModelViewSet(viewsets.ModelViewSet):

def list(self, request):
    if self.request.user.is_staff:
        return super(StaffOnlyModelViewSet, self).list(request)
    else:
        content = {'Unauthorised': 'This API is private'}
        return Response(content, status=status.HTTP_401_UNAUTHORIZED)

def retrieve(self, request, pk=None):
    if self.request.user.is_staff:
        return super(StaffOnlyModelViewSet, self).retrieve(request, pk=None)
    else:
        content = {'Unauthorised': 'This API is private'}
        return Response(content, status=status.HTTP_401_UNAUTHORIZED)

def create(self, request):
    if self.request.user.is_staff:
        return super(StaffOnlyModelViewSet, self).create(request)
    else:
        content = {'Unauthorised': 'This API is private'}
        return Response(content, status=status.HTTP_401_UNAUTHORIZED)

def update(self, request, pk=None):
    if self.request.user.is_staff:
        return super(StaffOnlyModelViewSet, self).update(request, pk=None)
    else:
        content = {'Unauthorised': 'This API is private'}
        return Response(content, status=status.HTTP_401_UNAUTHORIZED)

def destroy(self, request, pk=None):
    if self.request.user.is_staff:
        return super(StaffOnlyModelViewSet, self).destroy(request, pk=None)
    else:
        content = {'Unauthorised': 'This API is private'}
        return Response(content, status=status.HTTP_401_UNAUTHORIZED)

实现目标的更优雅的方式是使用。可以在视图级别全局声明,也可以使用装饰器声明

从:

您可以在views.py中使用它(其他方式请参见文档)

有些用户对权限和身份验证以及它们之间的关系感到困惑,因此我将为您提供一个快速入门

定义用户证明其身份的方法,权限定义谁有权访问哪些资源。无论身份是否在身份验证期间得到验证,都将根据权限检查用户的请求


当组合在一起时,您可以控制用户访问。例如,如果用户身份验证失败,但视图上的权限类设置为“IsAuthenticatedOrReadOnly”,则他们仍然可以获取/列出资源IsAdminUser’声明用户必须通过身份验证,并且必须是访问此视图的工作人员。这就是你在这种情况下想要的。

一件挑剔的事。。。401_UNAUTHORIZED通常用于告诉请求者,为了获得访问权限,他们必须对自己进行身份验证。403_禁止明确告诉请求者,他们无法使用经过身份验证的凭据获得访问权限(因为他们不是员工)。不过,这可能没什么关系(:现在这就是我希望的答案!一些简洁易懂的东西非常有用。谢谢。还有一点很重要,可以像Django设置文件:REST\u FRAMEWORK={'default\u permission\u CLASSES'那样将其定义为DRF默认权限类:('rest_framework.permissions.isadmin用户',),
class IsAdminUser(BasePermission):
    """
    Allows access only to admin users.
    """
    def has_permission(self, request, view):
        return request.user and request.user.is_staff
from rest_framework.permissions import IsAdminUser

class StaffOnlyModelViewSet(viewsets.ModelViewSet):
    permission_classes = (IsAdminUser,)