在Flask Web框架中使用方括号或点符号之间的区别是什么?两者似乎都有效,例如:
在Python脚本中,我可以设置session['username'] = 'Geraint'
。然后,我可以使用{{ session['username'] }}
或{{ session.username }}
两者之间的区别是什么?文档似乎更喜欢点符号,所以应该在所有案例中使用吗?
答案 0 :(得分:3)
这是Jinja2的一项功能,请参阅模板设计器文档的Variables section:
除了标准的Python
.
“下标”语法(__getitem__
)之外,您还可以使用点([]
)来访问变量的属性。
这是便利功能:
为方便起见,Jinja2中的
foo.bar
在Python层上执行以下操作:
- 在 foo (
getattr(foo, 'bar')
)上检查名为 bar 的属性- 如果没有,请在 foo (
中检查项目'bar'
)foo.__getitem__('bar')
- 如果没有,则返回一个未定义的对象。
foo['bar']
的作用大致相同,序列差异很小:
- 检查 foo 中的项目
'bar'
。 (foo.__getitem__('bar')
)- 如果没有,请在 foo 上检查名为 bar 的属性。 (
getattr(foo, 'bar')
)- 如果没有,则返回一个未定义的对象。
如果对象具有相同名称的项和属性,则这很重要。此外,
attr()
过滤器仅查找属性。
因此,如果您使用属性访问权限({{ session.username }}
),那么Jinja2将首先查找属性,然后查找键。由于Flask session
object是一个字典,这意味着你可能最终得到错误的结果;如果您在会话中的密钥get
下存储了数据,session.get
将返回字典方法,但session['get']
将返回与'get'
密钥关联的实际值。