当前位置:   article > 正文

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

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

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

  1. # 对session["test"]进行初始化赋值
  2. def page0(request):
  3. request.session["test"]={"a":1, "b":2, "c":3, "d":4}
  4. return HttpResponse("session['test']=" + str(request.session["test"]))
  5. # 显示session["test"]的当前值
  6. def page1(request):
  7. x = str(request.session["test"]) + ' <--before ' + str(random.random())
  8. return HttpResponse(x)
  9. # 删除session["test"]的其中两个成员
  10. def page2(request):
  11. del request.session["test"]["b"]
  12. del request.session["test"]["c"]
  13. x = str(request.session["test"]) + ' <--after ' + str(random.random())
  14. return HttpResponse(x)
  15. # 依次执行 page0 --> page1 --> page2 --> page1
  16. # 期望最后一次执行page1的时候,显示跟page2一样,但发现最后一次page1 显示的内容跟第一次page1一样。

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

request.session.save()

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

  1. # 把page2的代码改为对request.session["test"]重新赋值,结果符合预期了。
  2. def page2(request):
  3. test = request.session["test"]
  4. del test["b"]
  5. del test["c"]
  6. request.session["test"] = test
  7. x = str(request.session["test"]) + ' <--after ' + str(random.random())
  8. return HttpResponse(x)
  9. # 依次执行 page0 --> page1 --> page2 --> page1
  10. # 最后一次执行page1的结果,跟page2一样了。

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/137039
推荐阅读
相关标签
  

闽ICP备14008679号