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

Ger*_*son 5 python jinja2 flask

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

在Python脚本中我可以设置session['username'] = 'Geraint'. {{ session['username'] }}然后我可以使用或访问模板{{ session.username }}

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

Mar*_*ers 8

这是 Jinja2 的一个功能,请参阅模板设计器变量部分

\n\n
\n

.除了标准 Python __getitem__\xe2\x80\x9csubscript\xe2\x80\x9d 语法 ( ) 之外,您还可以使用点 ( ) 来访问变量的属性[]

\n
\n\n

这是一个方便的功能:

\n\n
\n

为了方便起见,foo.barJinja2中在Python层做了以下事情:

\n\n
    \n
  • 检查foo ( )上名为bar 的属性getattr(foo, \'bar\')
  • \n
  • 如果没有,则检查foo ( )\'bar\'中是否有项目foo.__getitem__(\'bar\')
  • \n
  • 如果不存在,则返回一个未定义的对象。
  • \n
\n\n

foo[\'bar\']工作原理基本相同,但顺序略有不同:

\n\n
    \n
  • 检查foo\'bar\'中的项目。( )foo.__getitem__(\'bar\')
  • \n
  • 如果没有,请检查foo上是否有名为bar 的属性。( )getattr(foo, \'bar\')
  • \n
  • 如果不存在,则返回一个未定义的对象。
  • \n
\n\n

如果对象具有同名的项目和属性,这一点很重要。此外,attr()过滤器仅查找属性。

\n
\n\n

因此,如果您使用属性 access( {{ session.username }}),那么 Jinja2 将首先查找属性然后查找。由于Flasksession对象是一个字典,这意味着您可能会得到错误的结果;get如果您在会话中的键下存储了数据,session.get则返回字典方法,但session[\'get\']会返回与该键关联的实际值\'get\'

\n