在Django中编辑会话变量

时间:2017-05-10 23:12:56

标签: python django session-variables

我想在我的会话变量中存储一个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

1 个答案:

答案 0 :(得分:3)

在实现Django时,会话在更改时会更新。

对于不可变类型,这非常简单,因为它们总是被赋值更改,并且会话__setitem__被调用。会议知道这一变化。

如果在会话中存储类似列表的可变对象,则只保留对它的引用。如果列表被更改,则引用保持不变。会话中没有任何内容被调用。它永远不会注意到这种变化。

因此,使用Djangos会话时,您应始终使用分配来存储或更改值。