【问题标题】:Django: Session Cache not updated when using Cookie Based Session StorageDjango:使用基于 Cookie 的会话存储时未更新会话缓存
【发布时间】:2014-07-31 14:32:48
【问题描述】:

我正在尝试使用 Django Session 来缓存一些数据。我的网络应用程序中没有数据库,所以我使用的是基于 cookie 的存储机制。我只能第一次成功地将数据保存在会话中。此后,如果我尝试更新会话缓存,它将不起作用。这是我发现的:

prior_states = request.session.get(workflow_id, [])
print "prior_state >>> ", prior_states
if state_id in prior_states:
    request.session.update({workflow_id: prior_states[:prior_states.index(state_id) + 1]})
else:
     prior_states.append(state_id)
     request.session.update({workflow_id : prior_states})

测试代码

#1st request:
print request.session.get(1) --> None
request.session[1] = [101] --> works
print request.session.get(1) --> [101]
#2nd request:
print request.session.get(1) --> [101]
request.session[1] = [101, 102] --> works
print request.session.get(1) --> [101,102]

#3rd request:
print request.session.get(1) --> [101] --> Can't follow why?

提前致谢!

【问题讨论】:

  • prior_states 永远不能是 None 如果在会话中不存在,它将是空列表,因为您在此处设置 default [] if None request.session.get(workflow_id, []) 最好将此条件 if prior_states is None: 更改为 if not prior_states:
  • 你使用的是什么版本的 Django?
  • 我使用的是 Django 1.5.1

标签: python django session cookies django-settings


【解决方案1】:

根据 Django 文档:

https://docs.djangoproject.com/en/1.6/topics/http/sessions/#when-sessions-are-saved

默认情况下,Django 只在 session 时保存到 session 数据库 已被修改——也就是说,如果它的任何字典值已被修改 分配或删除

request.session.modified = True

要更改此默认行为,请将 SESSION_SAVE_EVERY_REQUEST 设置设置为 True。当设置为 True 时,Django 将在每次请求时将会话保存到数据库中。

请注意,会话 cookie 仅在创建或修改会话时发送。如果 SESSION_SAVE_EVERY_REQUEST 为 True,会话 cookie 将在每个请求上发送。

同样,会话 cookie 的过期部分在每次发送会话 cookie 时都会更新。

【讨论】:

  • 谢谢。这很重要,因为除非使用 request.session.modified = TrueSESSION_SAVE_EVERY_REQUEST = True,否则不会保存 request.session 中的字典中的更新,例如 request.session['alfa'] = {'bravo': 42}
猜你喜欢
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-19
  • 2018-10-06
  • 1970-01-01
  • 2012-02-14
  • 1970-01-01
相关资源
最近更新 更多