Django:使用基于Cookie的会话存储时会话缓存未更新

1 投票
1 回答
2784 浏览
提问于 2025-04-18 09:19

我正在尝试使用Django的会话功能来缓存一些数据。因为我的网页应用没有数据库,所以我使用基于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?

提前谢谢你们!

1 个回答

2

根据Django的文档:

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

默认情况下,Django只有在会话被修改时才会保存到会话数据库,也就是说,只有当字典中的某些值被赋值或删除时,才会进行保存。

request.session.modified = True

如果你想改变这个默认行为,可以把SESSION_SAVE_EVERY_REQUEST这个设置改成True。设置为True后,Django会在每次请求时都把会话保存到数据库。

需要注意的是,只有在会话被创建或修改时,才会发送会话cookie。如果SESSION_SAVE_EVERY_REQUEST设置为True,那么每次请求都会发送会话cookie。

同样,每次发送会话cookie时,cookie的过期时间部分也会被更新。

撰写回答