Jinja2:如何不删除换行符?

时间:2019-05-02 23:30:38

标签: jinja2

通常在Jinja2模板中包含循环中的换行符,但是当行以{% ... %}语句结尾时,则不包含换行符。

尝试了几件事之后,似乎一条语句在结束标记后紧紧地插入了一个换行符,而我不知道该如何停止。

简单而有效

这个简单的例子按我的预期工作,保留换行符:

interface Loopback0
{% for net in ipv4_networks %}
 ip address {{ net }}
{% endfor %}
!
interface Loopback0
 ip address 1.2.3.148 255.255.255.255
 ip address 7.7.7.1 255.255.255.0
 ip address 1.0.0.1 255.0.0.0
!

(注意:不是我的实际IP!)

损坏

当我在行的末尾放置一条语句,例如if或内部for循环时,换行符消失了!

interface Loopback0
{% for net in ipv4_networks %}
 ip address {{ net }}{%- if loop.index > 1 %} secondary{% endif %}
{% endfor %}
!
interface Loopback0
 ip address 1.2.3.148 255.255.255.255 ip address 7.7.7.1 255.255.255.0 secondary ip address 1.0.0.1 255.0.0.0 secondary!

已修复?

如果我仅在语句末尾放置任何字符(甚至只是一个空格),则换行符将保留:

interface Loopback0
{% for net in ipv4_networks %}
 ip address {{ net }}{%- if loop.index > 1 %} secondary{% endif %}foo

{% endfor %}
!
interface Loopback0
 ip address 1.2.3.148 255.255.255.255foo
 ip address 7.7.7.1 255.255.255.0 secondaryfoo
 ip address 1.0.0.1 255.0.0.0 secondaryfoo
!

...但是,当然,我也有那些角色。

如果我添加另一个文字换行符,则保留它(两个中的一个):

interface Loopback0
{% for net in ipv4_networks %}
 ip address {{ net }}{%- if loop.index > 1 %} secondary{% endif %}

{% endfor %}
!
interface Loopback0
 ip address 1.2.3.148 255.255.255.255
 ip address 7.7.7.1 255.255.255.0 secondary
 ip address 1.0.0.1 255.0.0.0 secondary
!

这是所需的输出!但是我不想在其中添加多余的换行符,而且看来我应该能够修改这种行为。

注释

我设置了lstrip_blocks。因此,我不需要像this question那样删除任何空格。

The official doc on whitespace control描述了使用-删除空格,并使用+保留空格,但没有涵盖此特定情况。在示例中,我尝试将加号放在每个语句的开头和结尾,但没有一个得到期望的输出。

Python 3.7.3
Jinja2 2.10.1
PyYaml 5.1
ansible 2.7.10

0 个答案:

没有答案