Flask的会话对象是字典还是对象?

时间:2015-08-28 04:53:35

标签: python flask

我注意到我可以将session对象视为对象(session.myVal = 'foo')以及dict(session['myVal'] = 'foo')。您无法使用带有对象语法的dict语法访问值集,反之亦然。使用会话对象的正确方法是什么?

2 个答案:

答案 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']将是一个更安全的选择。