【发布时间】:2015-08-28 04:53:35
【问题描述】:
我注意到我可以将 session 对象视为对象 (session.myVal = 'foo') 以及 dict (session['myVal'] = 'foo')。您不能使用 dict 语法和对象语法访问值集,反之亦然。使用会话对象的正确方法是什么?
【问题讨论】:
我注意到我可以将 session 对象视为对象 (session.myVal = 'foo') 以及 dict (session['myVal'] = 'foo')。您不能使用 dict 语法和对象语法访问值集,反之亦然。使用会话对象的正确方法是什么?
【问题讨论】:
在会话上设置值的唯一有效方法是将会话视为字典 (session[key] = value)。 dict 项目将在请求之间保留。请参阅docs 了解更多信息。
会话是一个普通的 Python 类实例,因此在其上设置属性是完全有效的,但是这些不会影响实际的会话数据,它们只会在请求结束时消失。
您可以自己验证这一点:在会话上设置一个属性 (session.xyz = '123'),然后尝试在后续请求 (print(session.xyz)) 上将其打印出来,您将得到一个 AttributeError。
【讨论】:
在 Python 中,类 dict 属性 getter 和类对象属性 getter 都是通过魔术方法实现的(以 __ 开头和结尾)。
例如,您可以使用魔术方法__getitem__ 和__setitem__ 定义一个类似字典的对象:
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 魔法方法的信息可以在here找到。
在这种情况下,session 对象是werkzurg.local.LocalProxy 对象,即defines both __getattr__ and __getitem__,这就是为什么它可以有两种使用方式。
在我个人看来,这只是代码风格,我更喜欢obj.attr。那是因为,我认为IDE会更容易理解属性getter,并给我更好的tips支持。当您需要在重构时重命名属性时,它会更重要。
更新:对于session,它确实有一些自定义属性,所以session['attr']会是一个更安全的选择。
【讨论】: