Django中会话为何被意外保存?(多案例合并场景)
Django 4.2.3会话保存异常问题
我参照Django官方文档中「会话何时保存」的内容,以及自己在Stack Overflow的回答,完成了Django会话保存/不保存的常规实验,但遇到了一个异常情况:
场景1:合并执行4个案例
第一次运行以下代码:
# views.py from django.http import HttpResponse def test(request): # 案例1 request.session["foo"] = "bar" # 案例2 del request.session["foo"] # 案例3 request.session["foo"] = {} # 案例4 request.session["foo"]["bar"] = "baz" return HttpResponse('Test')
第二次运行代码查看会话:
# views.py from django.http import HttpResponse def test(request): print(request.session.get('foo')) # 输出:{'bar': 'baz'} return HttpResponse('Test')
发现案例4的会话修改被意外保存了。
场景2:分步骤执行
第一次运行前3个案例:
# views.py from django.http import HttpResponse def test(request): # 案例1 request.session["foo"] = "bar" # 案例2 del request.session["foo"] # 案例3 request.session["foo"] = {} return HttpResponse('Test')
第二次单独运行案例4:
# views.py from django.http import HttpResponse def test(request): # 案例4 request.session["foo"]["bar"] = "baz" return HttpResponse('Test')
第三次运行代码查看会话:
# views.py from django.http import HttpResponse def test(request): print(request.session.get('foo')) # 输出:{} return HttpResponse('Test')
此时会话并未保存案例4的修改。
额外说明
- 未使用
request.session.modified = True强制标记会话修改 - settings.py中已设置
SESSION_SAVE_EVERY_REQUEST = False
请问为何合并执行所有案例时,案例4的会话修改会被意外保存?
内容的提问来源于stack exchange,提问作者Super Kai - Kazuya Ito
相关产品推荐
相关产品推荐

