Django Rest Framework中仅限员工的权限

Joh*_*ohn 2 django django-rest-framework

我正在尝试创建只有员工的Django Rest Framework ModelViewSets.当我尝试使用标准的Django装饰器时,@staff_member_required我得到的错误让我相信装饰器不能与Django Rest Framework一起使用.

所以我正在尝试编写自己的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)
Run Code Online (Sandbox Code Playgroud)

Mar*_*way 17

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

来源:

class IsAdminUser(BasePermission):
    """
    Allows access only to admin users.
    """
    def has_permission(self, request, view):
        return request.user and request.user.is_staff
Run Code Online (Sandbox Code Playgroud)

您可以在views.py中使用它(有关其他方法,请参阅文档)

from rest_framework.permissions import IsAdminUser

class StaffOnlyModelViewSet(viewsets.ModelViewSet):
    permission_classes = (IsAdminUser,)
Run Code Online (Sandbox Code Playgroud)

有些用户对权限和身份验证以及它们之间的关系感到困惑,所以我会给你一个快速入门.

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

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