gpt4 book ai didi

python - Django 休息框架忽略 has_object_permission

转载 作者:太空狗 更新时间:2023-10-29 20:37:13 27 4
gpt4 key购买 nike

我正在尝试限制用户对对象的访问。只有创建者才能修改对象。为此目的,就像他们在我写的教程中所说的那样

class IsOwnerOrReadOnly(permissions.BasePermission):
def has_object_permission(self, request, view, obj):
return False

并将其添加到 permission_classes。但是任何用户仍然可以修改任何对象。如果我添加方法

    def has_permission(self, request, view):
return False

没有人能做任何事。因此,所有行为都由唯一的 has_permission 方法控制,该方法不提供任何方式来处理每个对象的权限。那我做错了什么吗?这是请求处理程序的代码

class ProblemsHandler(APIView):

permission_classes = (
IsOwnerOrReadOnly,
permissions.IsAuthenticatedOrReadOnly,
)

def pre_save(self, request, problem):
problem.author = request.user

def get_object(self, request, pk, format):
try:
problem = ProblemsModel.objects.get(pk=pk)
serializer = ProblemsSerializer(problem)
return Response(serializer.data, status=HTTP_200_OK)
except ProblemsModel.DoesNotExist:
raise Http404

def get_list(self, request, format):
problems = ProblemsModel.objects.all()
serializer = ProblemsSerializer(problems, many=True)
return Response(serializer.data, status=HTTP_200_OK)

def get(self, request, pk=None, format=None):
if pk:
return self.get_object(request, pk, format)
else:
return self.get_list(request, format)

def post(self, request, format=None):
serializer = ProblemsSerializer(data=request.DATA)
if serializer.is_valid():
self.pre_save(request, serializer.object)
serializer.save()
return Response(serializer.data, status=HTTP_201_CREATED)
else:
return Response(serializer.errors, status=HTTP_400_BAD_REQUEST)

def put(self, request, pk, format=None):
try:
problem = ProblemsModel.objects.get(pk=pk)
serializer = ProblemsSerializer(problem, data=request.DATA)
if serializer.is_valid():
self.pre_save(request, serializer.object)
serializer.save()
return Response(serializer.data, status=HTTP_200_OK)
else:
return Response(serializer.errors, status=HTTP_400_BAD_REQUEST)
except ProblemsModel.DoesNotExist:
raise Http404

def delete(self, request, pk, format=None):
try:
problem = ProblemsModel.objects.get(pk=pk)
problem.delete()
return Response(status=HTTP_204_NO_CONTENT)
except ProblemsModel.DoesNotExist:
raise Http404

最佳答案

对象的权限检查由 DRF 在方法 APIView.check_object_permissions 中完成。

由于您不使用 GenericAPIView,因此您定义了自己的 get_object 方法,并且必须自己调用 check_object_permissions。由于您有点误用了 get_object,因此您必须检查 GET(单个)、PUT 和 DELETE

self.check_object_permissions(self.request, obj)

也许可以更好地了解 DRF Generic Views ,因为您的用例看起来很像它们。通常 get_object 应该只返回一个对象并检查权限。

关于python - Django 休息框架忽略 has_object_permission,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22561698/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com