如何在Django中测试会话保存与未保存的四种场景?
测试Django会话保存状态的实操方法
前提:已在
settings.py中配置SESSION_SAVE_EVERY_REQUEST = False,且全程不使用request.session.modified = True语句,目标是验证Django文档《When sessions are saved》里的4种会话操作场景。
1. 搭建测试环境
先编写视图、配置URL和简单模板,用来执行测试和验证结果:
编写视图代码
# views.py from django.shortcuts import redirect, render def test_session(request, case): # 先初始化会话里的foo,保证测试场景2、4有操作对象 if "foo" not in request.session: request.session["foo"] = "initial_value" # 对应4种测试场景 if case == 1: # 场景1:直接给会话键赋值 request.session["foo"] = "bar" elif case == 2: # 场景2:删除会话键 del request.session["foo"] elif case == 3: # 场景3:给会话键赋值为字典 request.session["foo"] = {} elif case == 4: # 场景4:修改会话字典的子属性 request.session["foo"]["bar"] = "baz" # 跳转到验证页面看结果 return redirect("check_session") def check_session(request): # 把当前会话的关键信息传给模板 context = { "foo_content": request.session.get("foo", "键不存在"), "session_id": request.session.session_key, } return render(request, "check_session.html", context)
配置URL路由
# urls.py from django.urls import path from . import views urlpatterns = [ path("test/<int:case>/", views.test_session, name="test_session"), path("check/", views.check_session, name="check_session"), ]
创建验证模板
<!-- templates/check_session.html --> <!DOCTYPE html> <html> <head> <title>会话状态验证</title> </head> <body> <h3>当前会话信息</h3> <p>会话ID:{{ session_id }}</p> <p>foo的值:{{ foo_content }}</p> <hr> <p><a href="/test/1/">测试场景1:赋值会话键</a></p> <p><a href="/test/2/">测试场景2:删除会话键</a></p> <p><a href="/test/3/">测试场景3:赋值字典给会话键</a></p> <p><a href="/test/4/">测试场景4:修改会话字典子属性</a></p> </body> </html>
2. 执行测试的步骤
用浏览器隐私模式测试(避免其他会话干扰),每个场景按以下流程走:
- 打开隐私模式,访问
/check/,记录当前的foo_content和session_id; - 点击对应场景的链接,执行完操作后自动跳回
/check/,此时能看到当前会话的临时变化; - 完全关闭浏览器(确保会话进程结束),重新打开隐私模式,再次访问
/check/; - 对比两次的
foo_content:- 如果值变了,说明会话被保存到存储介质了;
- 如果值和初始状态一致,说明会话没被保存。
各场景的预期结果
- 场景1:重新打开后
foo_content变成bar→ 会话已保存 - 场景2:重新打开后
foo_content变成键不存在→ 会话已保存 - 场景3:重新打开后
foo_content变成{}→ 会话已保存 - 场景4:重新打开后
foo_content还是初始的initial_value→ 会话未保存
3. 更精准的验证方式(可选)
如果想直接查看存储介质里的会话数据:
- 用数据库存储会话的话,直接查
django_session表,找到对应session_id的session_data字段,用base64解码就能看到具体内容; - 用缓存存储会话的话,在Django shell里执行
from django.core.cache import cache; cache.get("你的session_id"),就能查看缓存里的会话数据是否更新。
内容的提问来源于stack exchange,提问作者Super Kai - Kazuya Ito
相关产品推荐
相关产品推荐

