编辑模式 · 点击文字即可修改 · Ctrl+S 导出 再次按 E 或点击左上角退出
模块 6.6 · 模块 6 收官

状态与会话

让每个访客,只看到自己的历史

🧑‍💻
访客甲
今晚月色真美今晚月色真美
这电影太好看了
🧑‍🎨
访客乙
这电影太好看了今晚月色真美
这电影太好看了
/api/analyze
/api/history
全部历史
/api/analyze
/api/history
全部历史
后端
谁来查
都查全部
存进去
SELECT *
两条都返回
🗄️
history
今晚月色真美
这电影太好看了
一张表,不分人
12
H T T P
🌐
浏览器
请求 request
新的请求
响应 response
服务端
本轮的状态
123

无状态

stateless
第 1 次请求
🌐
你是谁?
第 2 次请求
🌐
你是谁?
第 3 次请求
🌐
你是谁?

任意两次请求,完全独立

关卡
第 3 关
血量
62%
背包
🗡️ 🛡️ 🧪
机关
已开启
状态 state
01状态决定下一步会怎样
02状态有可能会丢失
12
ssh
HTTP
面对的连接
少量 · 长时间 · 要连续性
海量 · 极短 · 彼此无关
各自的选择
有状态,维持现场
无状态,用完就忘
如果 HTTP 也维持现场
✕同时来一百万人,就得存一百万份现场,内存先撑不住
✕后续请求必须回到同一台机器——负载均衡、临时加机器都没法做
✕那台机器一挂,挂在它上面的所有人的现场全没
1
技术底层
要效率与规模
每个请求彼此独立,才能自由扩展
遗忘
人的活动
要意义与连贯
事情有前因后果,才叫做事
记忆
浏览器
session_id=2c2f…
今晚月色真美
今晚月色真美
Cookie: id
Set-Cookie: id
id + 今晚月色真美
服务端
生成 session_id
今晚月色真美查到这条记录
情感 0.93 / 拼音
带 id 存进去
WHERE id = ?
这个 id 的记录
数据库
2c2f… | 今晚月色真美
123456789
01
唯一
不能和别人撞上,否则会串号,看到别人的历史
02
每次请求都带着
漏一次,那次请求就成了陌生人
03
不能被人猜出来
要是能被猜到,别人就能冒充我们的会话
浏览器
请求行GET /api/history HTTP/1.1
请求头Host · Accept · Cookie: session_id=2c2f…
空行
请求体
请求 request▶
◀响应 response
状态行HTTP/1.1 200 OK
响应头Content-Type · Set-Cookie: session_id=2c2f…
空行
响应体
服务端
1

项目改造三件事

浏览器
cookie 带着 id
请求
Cookie: id
Set-Cookie: id
服务端
生成 session_id
唯一 / 猜不出
连 id 一起存
数据库
+ session_id 字段
123

Set-Cookie 的内容

session_id=2c2f…fea1内容 ; Max-Age=2592000; HttpOnly; Path=/; SameSite=lax属性
12

跨源配置

前端
localhost:3000
credentials: "include"
C O R S
cookie
后端
localhost:8000
allow_credentials=True
123
状态存在哪儿
每次请求带什么
Web 会话
我们这一节做的
服务器那张 history 表,可以很大
一个 id32 个字符
大模型 API
裸调的时候
客户端自己那个 messages 数组
全部历史每次原样再交一遍
模块 6 · 生态的力量

六节走过的路

6.1生态——不要重复造轮子,优先用别人已经做出来的库
6.2第一次换芯——找到 pypinyin 和 snownlp,把文字实验室做成真的
6.3文件版历史——理解存储,理解数据库存在的必要性
6.4数据库——认识几类数据库,上手 SQLite 和 SQL
6.5第二次换芯——数据搬进 SQLite,理解什么叫重构
6.6状态与会话——每个访客有了自己的历史,也给认证打好了地基
清点行囊
静态前端HTML · CSS · JavaScript · React · Next.js
+
后端服务Python · FastAPI
+
SQLite一个 history.db 文件
功能,到此完整。剩下的,只差上线
功能,到此完整

模块 7,开始部署环节