我注意到我可以将session
对象视为对象(session.myVal = 'foo'
)以及dict(session['myVal'] = 'foo'
)。您无法使用带有对象语法的dict语法访问值集,反之亦然。使用会话对象的正确方法是什么?
答案 0 :(得分:7)
在会话上设置值的唯一有效方法是将会话视为字典(session[key] = value
)。 dict项目将在请求之间保留。有关详细信息,请参阅docs。
会话是一个普通的Python类实例,所以在它上面设置属性是完全有效的,但是这些不会影响实际的会话数据,当请求结束时它们就会消失。
您可以自己验证:在会话上设置一个属性(session.xyz = '123'
),然后尝试在后续请求(print(session.xyz)
)上打印出来,您将获得{{1 }}
答案 1 :(得分:-1)
在Python中,类似于dict的属性getter和类似于object的属性getter都是通过魔术方法实现的(以__
开始和结束)。
例如,您可以使用魔术方法__getitem__
和__setitem__
定义类似dict的对象:
class D:
data = dict(attr1=1, attr2=2)
def __getitem__(self, name):
return self.data.get(name)
print D()['attr1']
或者,您可以使用__getattr__
和__setattr__
创建类似对象的属性getter类:
class D:
data = dict(attr1=1, attr2=2)
def __getattr__(self, name):
return self.data.get(name)
print D().attr1
两者都可以。您可以更深入地了解此link中__getattr__
和__getattribute__
之间的区别。有关Python magic method的更多信息可以在here找到。
在这种情况下,session
对象是werkzurg.local.LocalProxy
对象,defines both __getattr__
and __getitem__
,这就是为什么它可以以两种方式使用的原因。
在我个人看来,它只涉及代码风格,我更喜欢obj.attr
。那是因为,我认为IDE会更容易理解属性getter,并给我一个更好的提示支持。在重构时需要重命名属性会更重要。
更新:对于session
,它确实有一些自定义属性,因此session['attr']
将是一个更安全的选择。