【问题标题】:Extra newline in Jinja2 templateJinja2 模板中的额外换行符
【发布时间】:2019-06-27 03:23:49
【问题描述】:

这是我用于生成模板的 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'

【问题讨论】:

  • 处理python脚本中的行并将它们作为资源呈现在jinja中。即处理后,只需迭代它们即可渲染。

标签: python jinja2


【解决方案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'

【讨论】:

    猜你喜欢
    • 2018-05-18
    • 1970-01-01
    • 1970-01-01
    • 2018-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多