Flask异步函数流式返回报错:function object is not iterable
问题修复方案
核心问题原因
Flask的stream_with_context仅支持同步可迭代对象/生成器,但你定义的generate()是异步生成器,直接传入会触发"function is not iterable"错误——因为异步生成器需要异步迭代逻辑处理,而Werkzeug的响应处理流程不支持直接遍历异步生成器。
修复步骤
1. 安装依赖
使用asgiref库的async_to_sync工具,将异步生成器转换为同步可迭代对象:
pip install asgiref
2. 修改代码
核心改动是用async_to_sync包装异步生成器,同时确保Flask版本支持异步路由(2.0+):
from flask import Flask, request, jsonify, session, Response, stream_with_context from asgiref.sync import async_to_sync # 新增导入 app = Flask(__name__) app.secret_key = "your_secret_key_here" # 替换为实际密钥 @app.route('/chatstm', methods=['POST']) async def chatstm(): if 'user_id' not in session: return jsonify({'error': 'Unauthorized'}), 401 # 获取请求参数 message = request.json.get('message') pdf_pc_id = request.json.get('pdf_pc_id') pdf_id = request.json.get('pdf_id') conversation_id = request.json.get('conversation_id') # 构建chat对象 chat = build_chatstm({ "pdf_pc_id": pdf_pc_id, "conversation_id": conversation_id, "pdf_id": pdf_id }) async def generate(): async for event in chat.astream_events( {"input": message}, config={"configurable": {"conversation_id": conversation_id}}, version="v2" ): if event["event"] == "on_chat_model_stream": # 若不需要字符串转义,可去掉repr()直接返回内容 yield f"{event['data']['chunk'].content}" # 关键:将异步生成器转为同步可迭代对象 sync_generator = async_to_sync(generate)() return Response(stream_with_context(sync_generator), content_type='text/event-stream')
3. 额外优化建议
- SSE格式规范:如果是前端接收Server-Sent Events,建议按标准格式返回,比如:
yield f"data: {event['data']['chunk'].content}\n\n" - 跨域处理:如果前端是跨域请求,安装
flask-cors并配置:
代码中添加:pip install flask-corsfrom flask_cors import CORS CORS(app)
错误细节解释
原代码中generate()返回的是异步生成器对象,Werkzeug的响应迭代逻辑尝试用同步for循环遍历它,但异步生成器不兼容同步迭代协议,因此抛出类型错误。通过async_to_sync包装后,异步生成器被转换为符合要求的同步可迭代对象,流式响应即可正常工作。
内容的提问来源于stack exchange,提问作者Eric Luque
相关产品推荐
相关产品推荐

