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

Django中间件向响应追加数据后客户端未接收成功问题排查

问题根源及解决方案

这个问题我之前也碰到过,核心原因是Django REST Framework(DRF)的Response对象会缓存渲染后的内容:

当视图返回Response后,DRF会自动将data序列化为对应格式(比如JSON)并存储在response.content中。你在中间件里修改了response.data,但并没有更新这个缓存的content,所以客户端收到的还是最初渲染好的内容,而你打印的是内存中已经修改后的data,这就导致了“打印正确但客户端收不到”的矛盾。

修复方案

只需要在修改response.data后,手动触发重新渲染即可,具体代码调整如下:

class ErrorMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response
    def __call__(self, request):
        response = self.get_response(request)
        # 先判断是否为DRF的Response对象,避免原生HttpResponse报错
        if hasattr(response, 'data') and 'errors' in response.data:
            response.data.update({'success': False})
            # 重新渲染响应,更新缓存的content
            response.render()
        print(response.data)
        return response

额外说明

  • 加上hasattr(response, 'data')的判断很重要:如果视图返回的是Django原生的HttpResponse(而非DRF的Response),它并没有data属性,直接访问会抛出异常。
  • response.render()方法会根据请求的Accept头部,重新使用对应的渲染器(比如JSONRenderer)将修改后的data序列化为content,确保客户端能拿到最新的响应内容。

内容的提问来源于stack exchange,提问作者Praful Bagai

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:45:59