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

Flask生成器函数中Session变量无法保存的解决方案求助

Flask流式响应中保存Session变量的解决方案

问题分析

你在使用Flask流式响应(生成器返回SSE)存储LLM聊天历史时,能访问Session中的chat_history,但修改后无法持久化——即便设置了session.modified = True也无效。核心问题有两点:

  • 流式响应的请求周期特殊,Flask默认的Session保存时机未正确触发;
  • 代码中login路由初始化session['chat_history']为字符串,而字符串没有append方法,这会导致运行时错误(你描述中能执行append应为笔误,实际需初始化为列表)。

解决步骤

1. 修正Session变量初始化

确保chat_history初始化为列表类型:

@app.route('/login', methods=['GET', 'POST'])
def login():
    # 初始化为空列表或含初始聊天数据的列表
    session['chat_history'] = []
    # 其他登录逻辑...

2. 在生成器中手动触发Session保存

对于列表这类可变对象的内部修改,Flask无法自动检测变化,需手动标记修改并强制保存Session:

@app.route("/chat", methods=['POST'])
@login_required
def chat():
    def ask_function():
        # 兜底初始化,防止会话中无chat_history键
        if 'chat_history' not in session:
            session['chat_history'] = []
        
        print(session['chat_history'])
        
        # 添加用户提问到历史
        session['chat_history'].append({"role": "user", "parts": "question"})
        
        # 手动标记Session已修改
        session.modified = True
        # 强制保存Session(关键步骤)
        session.save()
        
        yield "some random response"

    return Response(stream_with_context(ask_function()), mimetype='text/event-stream')

3. 补全会话有效期配置的依赖

before_request中使用timedelta需要先导入datetime模块:

from datetime import timedelta

@app.before_request
def make_session_permanent():
    session.permanent = True
    app.permanent_session_lifetime = timedelta(minutes=10)

关键原理说明

  • Flask仅在直接替换Session值(如session['key'] = new_value)时自动标记modified = True,对于列表、字典的内部修改,必须手动设置标记;
  • 使用flask-session的filesystem存储时,调用session.save()会立即将Session数据写入文件,避免流式响应结束时未触发保存的问题。

内容的提问来源于stack exchange,提问作者Jami Bailey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 07:47:19