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

ncecgwcz  于 2023-01-31  发布在  Go
关注(0)|答案(3)|浏览(114)

如何为基于函数的视图编写自定义权限?我使用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
vyswwuz2

vyswwuz21#

这似乎是一个已知的问题,当使用基于函数的视图时,has_object_permission不受支持,据报告为here
如果要调用has_permission,应该能够使用permission_classes装饰器来实现,如documentation

@api_view(['GET'])
@permission_classes((IsAuthenticated, ))
def example_view(request, format=None):
    content = {
        'status': 'request was permitted'
    }
    return Response(content)
jq6vz3qz

jq6vz3qz2#

我同意@Forge的回答,但是如果你仍然想完成这些事情,你可以遵循这个-

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

btqmn9zl3#

你必须在def function_name()之前加上这些词:

from rest_framework.decorators import authentication_classes
@authentication_classes([TokenAuthentication])
def func_name (request):
   # Enter your code here.

小心方括号内

相关问题