- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试限制用户对对象的访问。只有创建者才能修改对象。为此目的,就像他们在我写的教程中所说的那样
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/
我查看了关于同一主题的类似问题,我认为我遵循了为 has_object_permission 指定的所有规则。 . 这就是我在我的设置中所拥有的。 REST_FRAMEWORK = {
我正在尝试限制用户对对象的访问。只有创建者才能修改对象。为此目的,就像他们在我写的教程中所说的那样 class IsOwnerOrReadOnly(permissions.BasePermission
我有一个用于 API POST /api/samples/sample_id/check 的 View 集 SampleViewSet。我已经为它定义了对象级权限。 class SamplePermi
我对 Django-rest-framework 中的 BasePermission 感到困惑。 这里我定义了一个类:IsAuthenticatedAndOwner。 class IsAuthenti
我已经尝试了将近一整天的时间来解决这个问题,但我似乎无法弄清楚为什么 has_object_permission method ListCreateAPIView 时不调用在 DRF 中被调用.我已经
大家好我想在我的类UserDetail中使用APIView的自定义权限但是我注意到这个权限没有执行,我的权限叫做“IsOwner”,因为我想允许用户根据用户身份。每次我发出请求时,我都会收到错误消
我是一名优秀的程序员,十分优秀!