Flask SSE接口在Postman中返回空响应的原因排查
Flask流式返回ChatGPT响应:Postman返回空响应的原因及解决办法
问题背景
我正在开发一个Flask端点,用于流式返回OpenAI ChatGPT API的响应,核心代码如下:
def get_report_stream(msg): completion = openai.ChatCompletion.create(engine="gpt-4", messages=[ {"role": "system", "content": prompt()}, {"role": "user", "content": str(msg['Val'])}, ], stream=True) for line in completion: if 'content' in line['choices'][0]['delta']: yield line['choices'][0]['delta']['content'] @app.route("/load", methods=["POST"]) def load_bs_into_df(): stream = request.form.get('stream', default=False, type=bool) file_path = 'input.xlsx' input_data = load_data_from_excel(file_path) if stream: return Response(stream_with_context(get_report_stream(input_data)), mimetype='text/event-stream') else: report = get_report_whole(input_data) return {"df": input_data, "report": report}
使用curl命令测试时,控制台能正常接收流式响应:
curl -X POST -d "stream=true" http://127.0.0.1:5000/load
但通过Postman发送请求时,仅返回若干空响应,请问这是什么原因?
原因分析及解决方案
1. 响应未遵循SSE规范
你当前的代码直接yield纯文本内容,但**Server-Sent Events(SSE)**要求每条消息必须以data: 前缀开头,且以\n\n(两个换行符)结尾。curl能兼容简单的流式输出,但Postman严格遵循SSE格式校验,无法识别不符合规范的内容,因此显示为空。
修改get_report_stream函数,按照SSE规范包装输出内容:
def get_report_stream(msg): completion = openai.ChatCompletion.create(engine="gpt-4", messages=[ {"role": "system", "content": prompt()}, {"role": "user", "content": str(msg['Val'])}, ], stream=True) for line in completion: if 'content' in line['choices'][0]['delta']: # 按SSE规范格式化每条消息 yield f"data: {line['choices'][0]['delta']['content']}\n\n"
2. Postman的SSE处理设置问题
即使修复了响应格式,Postman默认可能需要调整设置才能正确显示流式响应:
- 在请求的Headers中添加
Accept: text/event-stream,明确告知服务器客户端支持SSE格式 - 发送请求后,切换到响应的Raw视图查看流式内容(Postman的"Pretty"视图可能无法实时解析SSE)
- 关闭请求设置中的"Automatically follow redirects"选项,避免重定向中断流式传输
内容的提问来源于stack exchange,提问作者Alex T
相关产品推荐
相关产品推荐

