引言
做Python Web开发的同学,大概率都被Cookie和Session绕晕过:
“为啥登录要存这俩东西?”
“它们到底存在哪?”
“用的时候该选哪个?”
其实这俩核心都是为了解决HTTP协议“无状态”的问题,只是分工不同。今天用最通俗的话+实战代码,把这俩概念讲透,新手也能秒懂!
一、先搞懂:Cookie和Session到底是啥?(生活化比喻)
HTTP协议就像你去咖啡店买咖啡,店员不会记住你上次买了什么、有没有充值——每次交易都是“一次性”的,这就是“无状态”。
而Cookie和Session,就是解决“让服务器记住你”的两个工具:
- • Cookie:相当于你手里的“小票”
服务器把你的信息(比如登录状态、偏好设置)加密后,发给浏览器,浏览器把它存在本地(电脑/手机里)。下次你再访问服务器,浏览器会自动带上这张“小票”,服务器一看就知道“哦,是你来了”。
✨ 核心:存在客户端(浏览器),大小有限制(一般4KB),可以自己设置过期时间。 - • Session:相当于咖啡店的“会员档案”
服务器不直接把你的信息发给浏览器,而是给你一个唯一的“档案编号(Session ID)”,这个编号存在Cookie里发给你;你的真实信息(比如用户名、权限)则存在服务器端(内存/数据库/Redis)。下次你带着编号来,服务器查档案就知道你的信息了。
✨ 核心:真实数据存在服务器端,客户端只存一个“编号”,更安全。
二、核心区别:一张表讲清楚
三、Python实战:用Flask演示Cookie和Session的使用
光说不练假把式,用最常用的Flask框架,写两行代码就能看到效果!
前置准备
先安装Flask:
pip install flask
1. 演示Cookie的设置与获取
from flask import Flask, make_response, request
app = Flask(__name__)
# 配置密钥(Session需要,Cookie可选)
app.secret_key = "your_secret_key_123"# 换成自己的随机字符串
# 设置Cookie
@app.route("/set_cookie")
defset_cookie():
# 创建响应对象
resp = make_response("已为你设置Cookie!")
# 设置Cookie:key=username,value=zhangsan,过期时间3600秒(1小时)
resp.set_cookie("username", "zhangsan", max_age=3600)
return resp
# 获取Cookie
@app.route("/get_cookie")
defget_cookie():
# 从请求中获取Cookie
username = request.cookies.get("username")
if username:
returnf"你好!Cookie中的用户名是:{username}"
else:
return"未找到Cookie信息"
if __name__ == "__main__":
app.run(debug=True)
运行代码后,访问 http://127.0.0.1:5000/set_cookie,再访问 http://127.0.0.1:5000/get_cookie,就能看到Cookie的效果。
👉 你可以打开浏览器的“开发者工具”→“应用”→“Cookie”,直接看到本地存储的Cookie信息。
2. 演示Session的设置与获取
from flask import Flask, session, request
app = Flask(__name__)
# 必须配置密钥,否则Session无法使用
app.secret_key = "your_secret_key_123"
# 设置Session
@app.route("/set_session")
defset_session():
# 把用户信息存入Session(服务器端)
session["username"] = "zhangsan"
session["age"] = 25
return"已为你设置Session!"
# 获取Session
@app.route("/get_session")
defget_session():
username = session.get("username")
age = session.get("age")
if username and age:
returnf"Session信息:用户名={username},年龄={age}"
else:
return"未找到Session信息"
# 清除Session
@app.route("/clear_session")
defclear_session():
session.clear() # 清空当前用户的Session
return"Session已清空"
if __name__ == "__main__":
app.run(debug=True)
运行后访问 http://127.0.0.1:5000/set_session,再访问 http://127.0.0.1:5000/get_session,就能拿到Session数据。
👉 此时浏览器里只会存一个叫session的Cookie,里面是Session ID,看不到真实的用户信息——这就是Session的安全优势。
四、实际开发中该怎么选?
- • 存储非敏感信息(比如用户的主题偏好、语言设置);
- • 存储敏感信息(比如登录状态、用户权限、购物车数据);
五、避坑提醒
- 1. Cookie一定要加密存储,避免明文传输(比如密码绝不能直接存在Cookie里);
- 2. Session的密钥(secret_key)一定要复杂,别用简单的字符串(比如123456);
- 3. 生产环境中,Session别存在内存里(重启服务器就丢了),建议用Redis/数据库存储。
总结
- 1. Cookie是“存在客户端的小票”,Session是“存在服务器的档案+客户端的编号”,核心都是解决HTTP无状态问题;
- 2. Cookie适合存非敏感、小体积数据,Session适合存敏感、大体积数据;
- 3. Python Web中(Flask/Django),Session本质依赖Cookie传递ID,安全性远高于纯Cookie存储。
看完这篇,是不是再也不混淆Cookie和Session了?动手跑一遍代码,理解会更深刻~
关键点回顾
- 1. 核心定位:Cookie存客户端(4KB限制、安全性低),Session存服务器端(无大小限制、安全性高),Session依赖Cookie传递ID;
- 2. 使用场景:非敏感/小数据用Cookie,敏感/大数据用Session;
- 3. 实战要点:Flask中使用Session必须配置
secret_key,生产环境Session建议用Redis存储。