如何为不同的http请求申请不同的权限类
How to apply different permission classes for different http requests
我有一个 UserViewSet
支持获取、post、修补和删除 HTTP 请求。我有不同角色的管理员,有些可以删除用户,有些则不能。
我想编辑我的 UserViewSet
以支持此功能。
我试过这样做:
class UserViewSet(ModelViewSet):
queryset = User.objects.all()
http_method_names = ['get', 'post', 'patch', 'delete']
def get_serializer_class(self):
if self.request.method == 'PATCH':
self.permission_classes = [CanEdit]
return UpdateUserSerializer
elif self.request.method == 'DELETE':
self.permission_classes = [CanDelete]
return UserSerializer
我不确定这是否是执行此操作的最佳做法。
您可以更改 get_permissions 方法,这是通常的方法:
def get_permission_classes(self):
if self.action in ['retrieve', 'update', 'partial_update']:
return [(IsAuthenticated & IsSelf) | IsAdminUser]
或使用 DRF 扩展作为结合序列化程序和权限的通用配置视图:
https://github.com/drf-psq/drf-psq
psq_rules = {
('retrieve', 'update', 'partial_update'): [
Rule([IsAdminUser], UserFullSerializer),
Rule([IsAuthenticated & IsSelf], UserBasicSerializer)
]
}
我有一个 UserViewSet
支持获取、post、修补和删除 HTTP 请求。我有不同角色的管理员,有些可以删除用户,有些则不能。
我想编辑我的 UserViewSet
以支持此功能。
我试过这样做:
class UserViewSet(ModelViewSet):
queryset = User.objects.all()
http_method_names = ['get', 'post', 'patch', 'delete']
def get_serializer_class(self):
if self.request.method == 'PATCH':
self.permission_classes = [CanEdit]
return UpdateUserSerializer
elif self.request.method == 'DELETE':
self.permission_classes = [CanDelete]
return UserSerializer
我不确定这是否是执行此操作的最佳做法。
您可以更改 get_permissions 方法,这是通常的方法:
def get_permission_classes(self):
if self.action in ['retrieve', 'update', 'partial_update']:
return [(IsAuthenticated & IsSelf) | IsAdminUser]
或使用 DRF 扩展作为结合序列化程序和权限的通用配置视图: https://github.com/drf-psq/drf-psq
psq_rules = {
('retrieve', 'update', 'partial_update'): [
Rule([IsAdminUser], UserFullSerializer),
Rule([IsAuthenticated & IsSelf], UserBasicSerializer)
]
}