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