Django StreamingHttpResponse在生产代理环境下无法流式输出
解决Django流式传输OpenAI响应在代理环境下的阻塞问题
Nginx代理配置调整
- 禁用响应缓冲:Nginx默认会缓冲完整响应后再转发,必须在对应location块中添加
proxy_buffering off; - 启用HTTP/1.1分块传输:设置
proxy_http_version 1.1;和proxy_set_header Connection '';,确保长连接和分块传输支持 - 彻底关闭缓存:添加
proxy_cache off;避免缓存机制干扰
示例Nginx配置片段:
location /api/ { proxy_pass http://your-django-server:8000; proxy_buffering off; proxy_http_version 1.1; proxy_set_header Connection ''; proxy_cache off; }
API Gateway配置调整
- 开启分块传输编码:在集成请求设置中启用分块传输,禁止API Gateway缓冲完整响应
- 调整超时时间:如果流式响应持续较长,需延长API Gateway的超时设置,防止连接提前断开
- 传递正确响应头:在集成响应中设置
Content-Type: text/event-stream和Transfer-Encoding: chunked
Django视图优化
- 补充必要响应头:除
text/event-stream外,添加禁用缓存和保持连接的头信息 - 确保生成器符合SSE规范:
generate_thing返回的迭代器需每次yield带换行符的内容(如yield f"data: {chunk}\n\n"),方便浏览器识别流片段
优化后的视图代码:
@api_view(['POST']) def generate(request): data = json.loads(request.body.decode('utf-8')) result = generate_thing(data) response = StreamingHttpResponse(result) response['Content-Type'] = 'text/event-stream' response['Cache-Control'] = 'no-cache' response['Connection'] = 'keep-alive' response['Transfer-Encoding'] = 'chunked' return response
核心原因
代理服务默认的缓冲机制会等待完整响应生成后再转发,这直接破坏了流式传输的实时性。必须通过配置禁用缓冲,并确保使用HTTP/1.1的分块传输编码,让代理实时转发每一段响应内容。
内容的提问来源于stack exchange,提问作者Adam Thometz
相关产品推荐
相关产品推荐

