gpt4 book ai didi

python - 如何在 ViewSet 中返回 403 而不是 404

转载 作者:太空狗 更新时间:2023-10-30 02:53:21 42 4
gpt4 key购买 nike

我正在开发一个 API 并拥有这个 ViewSet:

class ProjectViewSet(viewsets.ModelViewSet):
# API endpoint that allows projects to be viewed or edited.
queryset = Project.objects.all()
serializer_class = ProjectSerializer
authentication_classes = used_authentication_classes
permission_classes = (IsOwner,)

@detail_route(methods=['get'])
def functions(self, request, pk=None):
project = self.get_object()
if project is None:
return Response({'detail': 'Missing project id'}, status=404)
return Response([FunctionSerializer(x).data for x in Function.objects.filter(project=project)])

权限系统附加到此 API。这些权限适用于单个资源。但是当我调用应该返回用户有权访问的所有项目的 api/projects 时,它实际上返回了所有项目,无论用户是否应该能够获取某个项目列表与否。

所以我重写了 get_queryset 方法,只返回用户有权访问的项目:

def get_queryset(self):
if self.request.user.is_superuser or self.request.user.is_staff:
return Project.objects.all()
else:
return Project.objects.filter(user=self.request.user.user)

这行得通,但现在当我请求我无权访问的特定资源时,API 返回 404 而不是 403。

我明白为什么,因为我尝试从资源中获取的 PK 是未定义的,因为我只返回用户有权访问的项目。我不明白的是如何解决这个问题。

有谁知道我如何让它返回 403,或者我应该看哪里?

最佳答案

正如@Alasdair 所说,404 是经过深思熟虑的选择,但如果您仍想获得 403,您可以尝试:

def get_queryset(self):
user = self.request.user
allow_all = user.is_superuser or user.is_staff
if self.action == 'list' and not allow_all:
return Project.objects.filter(user=user)
return Project.objects.all()

关于python - 如何在 ViewSet 中返回 403 而不是 404,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49895472/

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