如何为基于功能的视图编写自定义权限?我正在使用REST框架,我编写了一个密文加密/解密API。我为每个键(key-detail
)提供了一个基于函数的视图,我只想让该键的所有者可以使用它。我知道在使用基于类的视图时,定义permission_classes
就足够了,但是如何为基于函数的视图执行此操作呢?我已尝试使用@permission_classes
装饰器,但它不适用于我的自定义权限,其编写如下:
class IsOwner(permissions.BasePermission):
"""
Custom permission to only allow owners of an object to access it.
"""
def has_object_permission(self, request, view, obj):
return obj.owner == request.user
答案 0 :(得分:4)
似乎这是一个已知问题,使用基于功能的视图时不支持has_object_permission
,报告here。
如果您想致电has_permission
,您可以使用permission_classes
@api_view('GET')
@permission_classes((IsAuthenticated, ))
def example_view(request, format=None):
content = {
'status': 'request was permitted'
}
return Response(content)
装饰器进行操作
commons-lang3-3.1.jar
答案 1 :(得分:0)
我同意@Forge answer,但如果您仍然想完成这些事情。您可以遵循此-
@api_view(['ANY_METHOD'])
@permission_classes([IsAuthenticated])
def model_delete_view(request, pk, *args, **kwargs):
obj = MyModel.objects.filter(pk=pk)
if not obj.exists():
return Response(
{'message': 'MyModel not found'},
status=status.HTTP_404_NOT_FOUND
)
obj = obj.filter(user=request.user)
if not obj.exists():
return Response(
{'message': 'You are not authorizated'},
status=status.HTTP_403_FORBIDDEN
)
obj.delete()
return Response({'message': 'MyModel deleted'}, status=status.HTTP_200_OK)