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

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-cors
    
    代码中添加:
    from flask_cors import CORS
    CORS(app)
    

错误细节解释

原代码中generate()返回的是异步生成器对象,Werkzeug的响应迭代逻辑尝试用同步for循环遍历它,但异步生成器不兼容同步迭代协议,因此抛出类型错误。通过async_to_sync包装后,异步生成器被转换为符合要求的同步可迭代对象,流式响应即可正常工作。

内容的提问来源于stack exchange,提问作者Eric Luque

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 08:35:05