当在本地var上操作时,获取到本地var的会话变量会发生变化

时间:2011-09-27 09:42:34

标签: python django session

我注意到在与Django中的会话变量交互时出现奇怪的行为。 在我的一个应用程序中,我创建了一个middleware.py文件,其中包含一个函数,该函数将存储对象的会话变量复制到本地变量中,然后从本地变量中更改对象的属性。碰巧我对局部变量所做的更改也应用于会话变量。似乎本地var只是对会话的引用。这种行为是否正确? 这是代码:

class CloudMiddleware(object):
    user = request.session['user']
    user.email = 'myemail'

当我做的时候

user = request.session['user']
email = user.email

电子邮件的价值等于'myemail'。 如果我想存储它,我一直认为我必须将对象保存在会话中。有人可以解释一下它是如何运作的吗?

2 个答案:

答案 0 :(得分:1)

user是一个可变对象,所以它是通过引用传递的。一切都是正确的。

答案 1 :(得分:1)

这与会话无关,而是Python可变对象工作方式的简单结果。当您执行user = request.session['user']时,您将获得对该对象的引用,就像存储在标准字典中的任何其他可变对象一样。所以,是的,当你更改其中一个属性时,你所拥有的任何其他引用都会引用该更改。

请注意,对于会话,此更改仅在当前请求的生命周期中保留。那是因为Django不知道会话对象已经改变了,所以除非你明确告诉它,否则不会保存它 - 请参阅the documentation了解详细信息。