如果每个地方都直接操作:
SESSIONS[session_id]
很快会失控。
所以我们需要:
SessionManager
统一管理。
最基础支持:
create_session
get_session
restore_session
close_session
list_sessions
append_message
append_tool_history
add_run
update_working_memory
为什么不让业务代码直接改 Session?
例如:
session.status = "CLOSED"
当然能改。
但以后持久化以后:
内存对象改了
数据库没同步
就会出现一致性问题。
如果统一:
session_manager.close_session(...)
后面 SessionManager 内部可以同时:
更新内存
写数据库
写日志
更新 updated_at
调用方不用变。
这就是 Manager 层的价值。
把这个 Manager 层画出来,会更容易理解为什么不建议业务代码到处直接改 Session 对象:
![图片[1]-小节二:自己实现 SessionManager——创建、读取、恢复、关闭都从一个入口走-大赛人网](https://www.dsrw.com/wp-content/uploads/2026/11/image-1539.png)
调用方只认 SessionManager 这一套入口。当前底层可以只是一个 dict,以后换成 SQLite、MySQL、PostgreSQL 或 Redis,外层调用方式都不需要跟着重写;与此同时,updated_at、版本号、状态校验、日志和持久化也有了统一落点。
教学版为了让代码直观,get_session() 返回的还是内存对象本身,所以调用者技术上仍能直接修改它。我们把更新统一走 Manager,是在先建立正确使用习惯;生产实现通常会返回快照,或者把读写放进 Repository / 事务中,真正避免绕过版本、权限和持久化逻辑。
第一个版本先用内存存储
这一节先不引入 SQLite。
我们用:
dict
保存 Session。
这样重点放在会话模型。
后面第 22 节会真正做持久化。
完整可运行 SessionManager
这段程序已经跑通:
创建 Session
写消息
记录 Tool
关联 Run
关闭
恢复
继续追加
restore_session() 是什么意思?
这里的 restore 不是,从数据库恢复。
当前版本只是:
把 CLOSED Session 重新激活
以后持久化以后,它还会承担:
根据 session_id 从 Store 加载
这也是为什么我们先设计接口,后换存储。
读取历史 Session
用户界面常见需求:
最近会话
所以:
list_sessions()
通常按:
updated_at DESC
排序。
后面前端就可以显示:
今天 15:20 修复 Flask 项目
昨天 21:05 分析广告收入下降
关闭和删除不是一回事
这点要特别讲。
close_session():
会话结束
但历史还保留
delete_session():
数据真的删除
课程当前只实现 close。
因为关闭比删除更符合会话生命周期。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
















请登录后查看评论内容