我想在视图集上应用django权限,为此我创建了一个装饰器,但它不起作用。我只想在传入的参数中调用装饰器中的权限类。
views.py
'''
class MapViewSet(viewsets.ModelViewSet):
serializer_class = MapSerializer
@permission_decorator(permission_class=MapPermission)
def get_queryset(self):
return Map.objects.all()
'''
utils.py
'''
METHODS = {'GET': 'view_permission',
'PATCH': 'add_permission',
'POST': 'add_permission',
'PUT': 'add_permission',
'DELETE': 'delete_permission'}
def check_user_permission(permission, user, tag):
# logic here
return True/False
class CustomBasePermissions(permissions.BasePermission):
@abstractmethod
def has_permission(self, request, view):
pass
class PermissionError(APIException):
status_code = status.HTTP_403_FORBIDDEN
default_detail = {'message': "You Don't have required permission"}
class MapPermission(CustomBasePermissions):
def has_permission(self, request, view):
if request.role == "owner":
return True
else:
permission = METHODS.get(request.method)
return check_user_permission(permission, request.user, 'map')
'''
decorators.py
'''
def permission_decorator(permission_class):
assert permission_class is not None, (
"@permission_decorator() missing required argument: 'permission_class'"
)
def decorator(func):
func.permission_classes = permission_class
return func
return decorator
'''
答案 0 :(得分:0)
请在您的视图集的权限类中应用权限
class MapViewSet(viewsets.ModelViewSet):
serializer_class = MapSerializer
permission_classes = [MapPermission]
这将自动满足您将通过此视图集执行的所有请求类型。