如何在ViewSet中返回403状态码,而非404?
如何在Django REST Framework ViewSet中将404状态码替换为403?
很简单,你只需要修改functions方法里返回响应的状态码参数就行,同时可以调整返回的提示信息,让它更贴合403状态码的语义(比如改成"无权限访问该项目")。
修改后的完整代码示例
class ProjectViewSet(viewsets.ModelViewSet): # 允许查看或编辑项目的API端点 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: # 将状态码从404改为403,同时调整提示文本更符合权限拒绝的场景 return Response({'detail': '无权限访问该项目'}, status=403) return Response(...) # 保留你原本的正常响应逻辑
补充细节说明
这里有个容易忽略的点:DRF的get_object()方法默认在找不到对应对象时,会直接抛出Http404异常,所以你当前的if project is None判断其实永远不会触发。如果你的实际场景是即使项目存在,但用户无权限访问时返回403,或者想把"资源不存在"的场景也替换为403,那可以调整逻辑如下:
@detail_route(methods=['get']) def functions(self, request, pk=None): try: project = self.get_object() except Http404: # 捕获资源不存在的异常,返回403而非默认的404 return Response({'detail': '无权限访问该资源'}, status=403) # 额外的权限校验:比如项目存在但用户不是所有者时返回403 if not request.user == project.owner: return Response({'detail': '无权限访问该项目'}, status=403) return Response(...)
403状态码的语义是服务器理解请求但拒绝执行,更适合权限不足的场景;而404代表资源不存在,所以调整提示文本能让前端更清晰地理解错误原因。
内容的提问来源于stack exchange,提问作者Snackoverflow
相关产品推荐
相关产品推荐

