【发布时间】:2016-08-16 15:42:15
【问题描述】:
我正在阅读《Flask Web 开发》。 在例 4-3 中,
{% extends "base.html" %}
{% import "bootstrap/wtf.html" as wtf %}
我想知道: 扩展和导入有什么区别?(我认为它们在用法上非常相似。) 在什么情况下,我会使用extends还是import?
【问题讨论】:
我正在阅读《Flask Web 开发》。 在例 4-3 中,
{% extends "base.html" %}
{% import "bootstrap/wtf.html" as wtf %}
我想知道: 扩展和导入有什么区别?(我认为它们在用法上非常相似。) 在什么情况下,我会使用extends还是import?
【问题讨论】:
当你extend另一个模板时,模板控制你(被调用者控制调用者)——只有“父”模板中的命名块会被渲染:
{% extends "base.html" %}
{% block main_content %}
Only shows up if there is a block called main_content
in base.html.
{% endblock main_content%}
另一方面,import 只是将模板绑定到模板范围内的名称,您可以控制何时何地调用它(调用者控制被调用者):
{% import "bootstrap/wtf.html" as wtf %}
Some of your own template code with {{ wtf.calls() }} where it makes sense.
【讨论】:
有不同。 {% extends parent.html %} 允许您渲染 parent.html 并覆盖其中定义的 {% block %},而 {% import %} 只允许您访问模板变量。
所以示例模板扩展了base.html 并从bootstrap/wtf.html 导入变量。把它想象成python的类继承和import语句。
【讨论】:
默认情况下,包含的模板会传递给当前上下文,而导入的模板则不会。 Jinja documentation
默认情况下,包含的模板不会被缓存,而导入的会。
原因是导入经常被用作包含宏的模块。
最好的做法是在包含宏的模板上使用导入,而当您只需要一些标记模板时最好使用包含。
【讨论】: