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'声明用户必须已通过身份验证,并且还必须是工作人员才能访问此视图.在这种情况下,这就是你想要的.
| 归档时间: |
|
| 查看次数: |
3013 次 |
| 最近记录: |