Django - 基于函数的视图的自定义权限

时间:2016-02-20 07:52:24

标签: python django django-rest-framework

如何为基于功能的视图编写自定义权限?我正在使用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

2 个答案:

答案 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)