我正在使用 Django REST 框架编写一个休息 API,我想用权限保护某些端点。权限类看起来提供了一种优雅的方式来实现这一点。我的问题是我想对不同的重写 ViewSet 方法使用不同的权限类。
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
def create(self, request, *args, **kwargs):
return super(UserViewSet, self).create(request, *args, **kwargs)
@decorators.permission_classes(permissions.IsAdminUser)
def list(self, request, *args, **kwargs):
return super(UserViewSet, self).list(request, *args, **kwargs)
在上面的代码中,我也想允许未经身份验证的用户注册(用户创建),但我不想让任何人列出用户,只是为了员工。
在docs我看到了使用 permission_classes
装饰器保护 API View (不是 ViewSet 方法)的示例,并且我看到了为整个 ViewSet 设置权限类。但它似乎不适用于重写的 ViewSet 方法。有没有办法只将它们用于某些端点?
最佳答案
我认为没有内置的解决方案。但是您可以通过覆盖 get_permissions
方法来实现:
from rest_framework.permissions import AllowAny, IsAdminUser
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
permission_classes_by_action = {'create': [AllowAny],
'list': [IsAdminUser]}
def create(self, request, *args, **kwargs):
return super(UserViewSet, self).create(request, *args, **kwargs)
def list(self, request, *args, **kwargs):
return super(UserViewSet, self).list(request, *args, **kwargs)
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]
关于python - Django rest framework permission_classes of ViewSet 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35970970/