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
相关产品推荐
相关产品推荐

