【问题标题】:Is Flask's session object a dict or an object?Flask 的会话对象是字典还是对象?
【发布时间】:2015-08-28 04:53:35
【问题描述】:

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

【问题讨论】:

    标签: python flask


    【解决方案1】:

    在会话上设置值的唯一有效方法是将会话视为字典 (session[key] = value)。 dict 项目将在请求之间保留。请参阅docs 了解更多信息。

    会话是一个普通的 Python 类实例,因此在其上设置属性是完全有效的,但是这些不会影响实际的会话数据,它们只会在请求结束时消失。

    您可以自己验证这一点:在会话上设置一个属性 (session.xyz = '123'),然后尝试在后续请求 (print(session.xyz)) 上将其打印出来,您将得到一个 AttributeError

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-14
        • 2014-08-28
        • 2014-09-12
        • 2011-03-19
        • 2017-03-05
        • 1970-01-01
        • 1970-01-01
        • 2019-01-29
        相关资源
        最近更新 更多