You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:34:58