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的解决方案。

相关推荐
做梦敲代码32 分钟前
达梦数据库-读写分离集群部署
数据库·达梦数据库
小蜗牛慢慢爬行1 小时前
如何在 Spring Boot 微服务中设置和管理多个数据库
java·数据库·spring boot·后端·微服务·架构·hibernate
hanbarger1 小时前
nosql,Redis,minio,elasticsearch
数据库·redis·nosql
微服务 spring cloud2 小时前
配置PostgreSQL用于集成测试的步骤
数据库·postgresql·集成测试
先睡2 小时前
MySQL的架构设计和设计模式
数据库·mysql·设计模式
弗罗里达老大爷2 小时前
Redis
数据库·redis·缓存
仰望大佬0072 小时前
Avalonia实例实战五:Carousel自动轮播图
数据库·microsoft·c#
学不透java不改名2 小时前
sqlalchemy连接dm8 get_columns BIGINT VARCHAR字段不显示
数据库
一只路过的猫咪2 小时前
thinkphp6使用MongoDB多个数据,聚合查询的坑
数据库·mongodb