Flask 模板中点表示法和方括号的区别

问题描述 投票:0回答:1

Flask Web 框架中使用方括号或点符号有什么区别?两者似乎都有效,例如:

在Python脚本中我可以设置

session['username'] = 'Geraint'
。然后我可以使用
{{ session['username'] }}
{{ session.username }}

访问模板

两者有什么区别?文档似乎更喜欢点表示法,所以应该在所有情况下使用它吗?

python flask jinja2
1个回答
8
投票

这是 Jinja2 的一个功能,请参阅 Template Designer 文档的 Variables 部分

除了标准 Python

.
“下标”语法 (
__getitem__
) 之外,您还可以使用点 (
[]
) 来访问变量的属性。

这是一个方便的功能:

为了方便起见,Jinja2中的

foo.bar
在Python层做了以下事情:

  • 检查 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'
键关联的实际值。

© www.soinside.com 2019 - 2024. All rights reserved.