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

Django DRF使用SimpleJWT实现登出时Serializer的save方法返回Response无效怎么办

你的猜测是正确的,Serializer的save()方法本身不需要返回HTTP响应对象,问题原因如下:

  1. 职责边界不符合DRF设计规范:序列化器的核心作用是完成数据校验、序列化/反序列化、数据持久化相关逻辑,Response属于视图层负责构造的HTTP响应对象,不属于序列化器的职责范围。
  2. 视图层逻辑覆盖了序列化器返回值:即使你在save()中返回了Response对象,视图代码调用serializer.save()后没有接收这个返回值,直接返回了固定的status.HTTP_204_NO_CONTENT响应,该状态码的HTTP规范明确要求不能携带响应体,自然不会返回任何自定义内容。

修复方案

调整序列化器和视图的职责划分,序列化器仅返回操作状态和提示信息,由视图层构造对应的响应:

修改后的序列化器代码

class LogoutSerializer(serializers.Serializer):
    refresh = serializers.CharField()

    def validate(self, attrs):
        self.token = attrs['refresh']
        return attrs

    def save(self, **kwargs):
        try:
            RefreshToken(self.token).blacklist()
            # 返回成功标识和提示信息
            return True, "token has been blacklisted"
        except TokenError:
            # 返回失败标识和提示信息
            return False, "token is expired or blacklisted"

修改后的视图代码

class LogoutAPIView(APIView):
    serializer_class = LogoutSerializer
    permission_classes = [IsAuthenticated]

    def post(self, request):
        serializer = self.serializer_class(data = request.data)
        serializer.is_valid(raise_exception = True)
        # 接收序列化器返回的状态和信息
        success, msg = serializer.save()
        if success:
            return Response({'msg': msg}, status=status.HTTP_200_OK)
        else:
            return Response({'msg': msg}, status=status.HTTP_400_BAD_REQUEST)

内容的提问来源于stack exchange,提问作者Abinash Karki

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 18:09:00