一、核心方法解析
1. get(key, default=None)
-
功能:安全获取会话数据
-
参数:
-
key
:字符串类型,数据键名 -
default
:可选,当键不存在时返回默认值
-
-
返回值:
- 键对应的值,或默认值
-
应用场景:
# 获取用户选择的主题,未设置时返回默认light theme = request.session.get('theme', 'light')
-
注意:
- 相比直接通过
[]
访问,可避免KeyError异常
- 相比直接通过
2. __setitem__(key, value)
(等价于session[key] = value
)
-
功能:设置会话数据
-
参数:
-
key
:字符串键名 -
value
:可序列化的数据(支持基本类型/字典/列表)
-
-
返回值:无
-
应用场景:
# 保存用户语言偏好 request.session['language'] = 'zh-CN'
-
注意:
-
修改操作会自动标记
modified=True
-
存储复杂对象需确保可序列化(避免ORM对象)
-
3. flush()
-
功能:清空会话并生成新sessionid
-
参数:无
-
返回值:无
-
应用场景:
# 用户注销时完全清除会话 def logout_view(request): request.session.flush() return redirect('/login')
-
警告:
-
立即删除服务端存储数据
-
客户端Cookie中的sessionid将失效
-
4. pop(key, default=None)
-
功能:删除指定键并返回其值
-
参数:
-
key
: 要删除的键 -
default
: 键不存在时的返回值
-
-
返回值:
- 删除键的值或默认值
-
应用场景:
# 一次性读取验证码后删除 captcha = request.session.pop('captcha', None) if not captcha: return HttpResponse("验证码已失效")
5. set_expiry(value)
-
功能:设置会话过期时间
-
参数类型:
-
整数:秒数(如
3600
代表1小时) -
0
:浏览器关闭时过期 -
None
:使用全局SESSION_COOKIE_AGE
配置
-
-
示例:
# 保持登录状态7天 request.session.set_expiry(7 * 86400)
二、辅助方法
1. clear()
-
功能:清空所有会话数据,但保留sessionid
-
区别:
- 不同于
flush()
,不删除服务端记录
- 不同于
-
适用场景:
# 重置用户临时数据 request.session.clear()
2. setdefault(key, default)
-
功能:若键不存在,则设置默认值
-
等效逻辑:
if key not in session: session[key] = default return session[key]
3. modified
属性
-
作用:
-
标记会话数据是否修改
-
可强制触发保存
-
-
示例:
request.session['counter'] = 5 # 自动标记modified=True request.session.modified = True # 显式强制保存
三、安全开发准则
1. 数据存储规范
- ❌ 禁止存储明文密码、信用卡号等敏感信息
- ✔️ 用户凭证仅存储ID等引用数据
# 正确做法
request.session['user_id'] = user.id
# 危险做法
request.session['user'] = {
'id': user.id,
'password': user.password # 绝对禁止!
}
2. Cookie安全配置
# settings.py 推荐配置
SESSION_COOKIE_HTTPONLY = True # 禁止JS访问
SESSION_COOKIE_SECURE = True # 仅HTTPS传输
SESSION_COOKIE_SAMESITE = 'Lax' # 阻止CSRF
3. 性能优化
- 避免存储大对象(>2KB)
- 高频读写场景使用Redis后端
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/1",
}
}
四、实践教学:购物车功能
代码实现
def add_to_cart(request, product_id):
cart = request.session.get('cart', {})
cart[product_id] = cart.get(product_id, 0) + 1
request.session['cart'] = cart
return JsonResponse({'status': 'success'})
def checkout(request):
cart = request.session.pop('cart', {}) # 一次性取出清空
if not cart:
return HttpResponse("购物车为空")
# 创建订单逻辑
return render(request, 'checkout.html', {'cart': cart})
核心要点:
get()
/set()
实现安全数据存取flush()
用于彻底销毁会话set_expiry()
控制会话生命周期- 安全准则优先防护敏感数据