You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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. 执行测试的步骤

用浏览器隐私模式测试(避免其他会话干扰),每个场景按以下流程走:

  1. 打开隐私模式,访问/check/,记录当前的foo_content和session_id;
  2. 点击对应场景的链接,执行完操作后自动跳回/check/,此时能看到当前会话的临时变化;
  3. 完全关闭浏览器(确保会话进程结束),重新打开隐私模式,再次访问/check/;
  4. 对比两次的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 07:37:28