Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django-基于函数的视图的自定义权限_Python_Django_Django Rest Framework - Fatal编程技术网

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

Python Django-基于函数的视图的自定义权限,python,django,django-rest-framework,Python,Django,Django Rest Framework,如何为基于函数的视图编写自定义权限?我正在使用REST框架,并且我已经编写了一个密文加密/解密API。对于每个密钥(密钥详细信息),我都有一个基于函数的视图,我只希望该密钥的所有者可以使用该视图。我知道,当使用基于类的视图时,定义权限\u类就足够了,但是如何为基于函数的视图定义权限?我已尝试使用@permission\u classes装饰器,但它不适用于我的自定义权限,其编写方式如下: class IsOwner(permissions.BasePermission): """

如何为基于函数的视图编写自定义权限?我正在使用REST框架,并且我已经编写了一个密文加密/解密API。对于每个密钥(
密钥详细信息
),我都有一个基于函数的视图,我只希望该密钥的所有者可以使用该视图。我知道,当使用基于类的视图时,定义
权限\u类就足够了,但是如何为基于函数的视图定义权限?我已尝试使用
@permission\u 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

据报道,这似乎是一个已知问题,
具有对象权限
在使用基于函数的视图时不受支持

如果您想调用
has_permission
,您应该可以使用
permission_classes
装饰器,如中所示

我同意,但如果你仍然想完成这样的事情。您可以按此操作-

@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)

但是它是一个视图函数,没有
self
这样的东西,所以我不能调用
self。检查\u object\u权限(请求,obj)
。api\u视图装饰程序现在需要的是字符串列表,而不是字符串。因此,使用上述方法可能会导致AssertionError,如果是,请尝试使用@api_view(['GET']),而不是@api_view('GET')。
@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)