Jinja2模板中的额外换行符

时间:2019-06-27 03:23:49

标签: python jinja2

这是我用于生成模板的Python代码

import jinja2

with open('test.j2', 'r') as f:
    template_body = f.read()

template = jinja2.Template(template_body)#, trim_blocks=True)
result = template.render(longest=len('staging'),
    envs=['devel', 'staging', 'prod'])

print(result)

这里的想法是我想根据列表中的最长字符串生成缩进。

devel   = 1
staging = 1
prod    = 1

我终于想出了一个解决方案:

{% for env in envs -%}
{%- set padding = (longest - env|length + 1)|string %}
{% set f = "%-" + padding + "s" -%}
{{ env }}{{ f | format(' ',)}}= 1
{%- endfor %}

但是我得到了

$ python test.py

devel   = 1
staging = 1
prod    = 1

在输出的开头有一个额外的换行符。使用Python的调试器,我们可以看到输出:

$ python test.py
> /private/tmp/test.py(11)<module>()
-> print(result)
(Pdb) result
u'\ndevel   = 1\nstaging = 1\nprod    = 1'

1 个答案:

答案 0 :(得分:1)

通过在set行中不取消换行,可以在每行之前打印换行。另一方面,您要在endfor行的末尾禁止换行。因此,您会在每行之前获得一个换行符,但不会在每行之后获得一个换行符。

通过像这样更改代码,您将得到相反的结果:

{% for env in envs -%}
{%- set padding = (longest - env|length + 1)|string -%}
{% set f = "%-" + padding + "s" -%}
{{ env }}{{ f | format(' ',)}}= 1
{% endfor %}

result

u'devel   = 1\nstaging = 1\nprod    = 1\n'