EDIT
编辑模式 · 点击文字即可修改 · Ctrl+S 导出
再次按 E 或点击左上角退出
☾
模块 6.6 · 模块 6 收官
状态与会话
让每个访客,只看到自己的历史
🧑💻
访客甲
今晚月色真美
今晚月色真美
这电影太好看了
🧑🎨
访客乙
这电影太好看了
今晚月色真美
这电影太好看了
/api/analyze
/api/history
全部历史
/api/analyze
/api/history
全部历史
后端
谁来查
都查全部
存进去
SELECT *
两条都返回
🗄️
history
今晚月色真美
这电影太好看了
一张表,不分人
1
2
H T T P
🌐
浏览器
请求 request
新的请求
响应 response
服务端
本轮的状态
1
2
3
无状态
stateless
第 1 次请求
🌐
你是谁?
第 2 次请求
🌐
你是谁?
第 3 次请求
🌐
你是谁?
任意两次请求,完全独立
关卡
第 3 关
血量
62%
背包
🗡️ 🛡️ 🧪
机关
已开启
状态
state
01
状态决定下一步会怎样
02
状态有可能会丢失
1
2
ssh
HTTP
面对的连接
少量
·
长时间
· 要连续性
海量
·
极短
· 彼此无关
各自的选择
有状态
,维持现场
无状态
,用完就忘
如果 HTTP 也维持现场
✕
同时来一百万人,就得存
一百万份现场
,内存先撑不住
✕
后续请求
必须回到同一台机器
——负载均衡、临时加机器都没法做
✕
那台机器一挂,挂在它上面的
所有人的现场全没
1
技术底层
要效率与规模
每个请求彼此独立,才能自由扩展
遗忘
人的活动
要意义与连贯
事情有前因后果,才叫做事
记忆
浏览器
session_id=2c2f…
今晚月色真美
今晚月色真美
Cookie: id
Set-Cookie: id
id + 今晚月色真美
服务端
生成 session_id
今晚月色真美
查到这条记录
情感 0.93 / 拼音
带 id 存进去
WHERE id = ?
这个 id 的记录
数据库
2c2f… | 今晚月色真美
1
2
3
4
5
6
7
8
9
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 字段
1
2
3
Set-Cookie 的内容
session_id=2c2f…fea1
内容
; Max-Age=2592000; HttpOnly; Path=/; SameSite=lax
属性
1
2
跨源配置
前端
localhost:3000
credentials: "include"
C O R S
cookie
后端
localhost:8000
allow_credentials=True
1
2
3
状态存在哪儿
每次请求带什么
Web 会话
我们这一节做的
服务器
那张 history 表,可以很大
一个 id
32 个字符
大模型 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,
开始部署环节