是否有任何理由在 Jinja 模板中使用 {% block name %} 而不是 {{ self.name() }} ?

Is there any reason to use {% block name %} over {{ self.name() }} in Jinja templating?

我 运行 遇到了想要在同一个基本模板中多次重复使用同一个内容块的问题。这导致我使用以下内容:

<li>
  {% block backup %} {% endblock %}
</li>
...
<li>
  {{ self.backup() }}
</li>

与每次只使用 self.backup() 相比,使用一次 block backup 然后每次使用 self.backup() 有什么优势吗?从我最基本的测试来看,网站上没有直接的区别。两种变体的运行和外观都一样。

该网站只是我公司的一个小型内部常见问题解答,因此性能并不是真正的问题。

一个 use-case 其中 {% block name %}{% endblock %} 有效但 {{ self.name()}} 无效是在模板化可选内容时。用 self 指定的任何内容都必须存在于 extends 它的页面中。
示例:

base.html

<head>
  ...
  <link rel="stylesheet" type="text/css" href="static/css/reset.css"/>
  <link rel="stylesheet" type="text/css" href="static/css/styles.css"/>
  
  {{ self.stylesheet() }}

</head>

如果页面 extending base.html 不包含 {% block stylesheet %}...{% endblock %},则该页面在找不到 stylesheet 时将无法加载并出现 500 服务器错误。如果它在 base.html 中声明为 {% block stylesheet %}...{% endblock %},则不会发生这种情况,它只是被跳过。
(通过添加 required 关键字,{% block name %} 可以使用相同的行为。)