django中session值的数据类型是dict,需要手动save(),更新才会传递到其他页面。

django 项目在一个页面中删除了session中的某一个成员(del request.session["test"]["a"]),切换到另外一个页面的时候,session中的那个成员居然还在。让我一阵莫名其妙。

python 复制代码
# 对session["test"]进行初始化赋值
def page0(request):
    request.session["test"]={"a":1, "b":2, "c":3, "d":4}
    return HttpResponse("session['test']=" + str(request.session["test"]))


# 显示session["test"]的当前值
def page1(request):
    x = str(request.session["test"]) + ' <--before ' + str(random.random())
    return HttpResponse(x)


# 删除session["test"]的其中两个成员
def page2(request):
    del request.session["test"]["b"]
    del request.session["test"]["c"]
    x = str(request.session["test"]) + ' <--after ' + str(random.random())
    return HttpResponse(x)



# 依次执行 page0 --> page1 --> page2 --> page1
# 期望最后一次执行page1的时候,显示跟page2一样,但发现最后一次page1 显示的内容跟第一次page1一样。

后来在page2中加了一句request.session.save() 后显示才符合预期。

python 复制代码
request.session.save()

我印象中不需要主动.save()的啊,猜想可能是因为request.session["test"]的数据类型是字典,里面成员的更新,在session中间件中没有检测到。 request.session的直接成员重新赋值,才会被检测到。验证发现果然是这样。

python 复制代码
# 把page2的代码改为对request.session["test"]重新赋值,结果符合预期了。

def page2(request):

    test = request.session["test"]
    del test["b"]
    del test["c"]
    request.session["test"] = test
    x = str(request.session["test"]) + ' <--after ' + str(random.random())
    return HttpResponse(x)



# 依次执行 page0 --> page1 --> page2 --> page1
# 最后一次执行page1的结果,跟page2一样了。

对于这个问题,gpt3.5无法发现问题所在,gemini给出save()方案解决,gpt4给出取出来更新再重新赋值给session的解决方案。

相关推荐
java1234_小锋30 分钟前
[免费]基于Python的农产品可视化系统(Django+echarts)【论文+源码+SQL脚本】
python·信息可视化·django·echarts
小马爱打代码1 小时前
MyBatis:性能优化实战 - 从 SQL 优化到索引设计
sql·性能优化·mybatis
SelectDB1 小时前
Apache Doris 4.0.1 版本正式发布
数据库·apache
Doro再努力1 小时前
MySQL数据库07:分组查询与分类查询
数据库·mysql
Elastic 中国社区官方博客2 小时前
Elasticsearch:如何为 Elastic Stack 部署 E5 模型 - 下载及隔离环境
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
间彧2 小时前
SpringBoot + MyBatis-Plus + Dynamic-Datasource 读写分离完整指南
数据库·后端
静若繁花_jingjing3 小时前
NoSql数据库概念
数据库·nosql
间彧3 小时前
除了AOP切面,还有哪些更灵活的数据源切换策略?比如基于注解或自定义路由规则
数据库·后端
弥生赞歌3 小时前
Mysql作业四
数据库·mysql
间彧3 小时前
🏗️ Spring Boot 3实现MySQL读写分离完整指南
数据库