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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 07:37:07