我想在我的会话变量中存储一个Python列表,并在后续的视图调用中编辑它。我刚刚做了这个(在视图中):
if 'x' not in request.session:
request.session['x'] = []
request.session['x'].append('test')
这仅适用于第一次尝试,即在第一次调用此视图后,会话实际上将在dict键['test']
下包含'x'
。但是,当我第二次尝试这样做时,列表会更新(正如我在调试时看到的那样),但是值不会持久化,调试任何后续调用都会证明:值仍为['test']
长期而不是成为['test','test']
。
我发现以下步骤是一种解决方法,但我不确定是否应该尝试解决它:这段代码是否规避了Django强加的合理约束?
temp_var = request.session['x']
temp_var.append('test')
request.session['x'] = temp_var
答案 0 :(得分:3)
在实现Django时,会话在更改时会更新。
对于不可变类型,这非常简单,因为它们总是被赋值更改,并且会话__setitem__
被调用。会议知道这一变化。
如果在会话中存储类似列表的可变对象,则只保留对它的引用。如果列表被更改,则引用保持不变。会话中没有任何内容被调用。它永远不会注意到这种变化。
因此,使用Djangos会话时,您应始终使用分配来存储或更改值。