Flask Web 框架中使用方括号或点符号有什么区别?两者似乎都有效,例如:
在Python脚本中我可以设置
session['username'] = 'Geraint'
。然后我可以使用 {{ session['username'] }}
或 {{ session.username }}
访问模板
两者有什么区别?文档似乎更喜欢点表示法,所以应该在所有情况下使用它吗?
这是 Jinja2 的一个功能,请参阅 Template Designer 文档的 Variables 部分:
除了标准 Python
“下标”语法 (.
) 之外,您还可以使用点 (
__getitem__
) 来访问变量的属性。
[]
这是一个方便的功能:
为了方便起见,Jinja2中的
在Python层做了以下事情:foo.bar
- 检查 foo 上名为 bar 的属性 (
)
getattr(foo, 'bar')
- 如果没有,请检查
foo中的项目'bar'
()
foo.__getitem__('bar')
- 如果不存在,则返回一个未定义的对象。
工作原理基本相同,但顺序略有不同:
foo['bar']
- 检查
foo中的项目'bar'
。 ()
foo.__getitem__('bar')
- 如果没有,请检查 foo 上是否有名为 bar 的属性。 (
)
getattr(foo, 'bar')
- 如果不存在,则返回一个未定义的对象。
如果对象具有同名的项目和属性,这一点很重要。此外,
过滤器仅查找属性。
attr()
因此,如果您使用属性访问 (
{{ session.username }}
),那么 Jinja2 将首先查找 attribute,然后查找 key。由于 Flask session
对象 是一个字典,这意味着您可能会得到错误的结果;如果您在会话中的键 get
下存储了数据,则 session.get
返回字典方法,但 session['get']
将返回与 'get'
键关联的实际值。