jinja2 python渲染" for循环"

时间:2017-07-24 14:06:31

标签: python python-2.7 jinja2

我一直在寻找一种方法来手动渲染我需要的jinja2模板。

这让我了解了python jinja渲染功能,但是我的python几乎不存在。

但是,使用google-search找到的示例脚本看起来非常简单(乍一看)

我的模板包含for循环以及我遇到一些困难的地方。

jinja2模板:

   .attr("fill", function (d) {
        return d.data.year === "Dec" ? z2(d.key) : z(d.key);
    })

如您所见,我尝试从模板生成openssl扩展用法文件。 (但这不是重点)

脚本:

{% if extendedKeyUsage is defined and extendedKeyUsage %}
subjectAltName = {% for SAN_IP in TLS_IP_SANS %}IP:{{ SAN_IP }}, {% endfor %}{% for SAN_DNS in TLS_DNS_SANS %}DNS:{{ SAN_DNS }}, {% endfor %}IP:127.0.0.1
extendedKeyUsage = clientAuth,serverAuth
{% endif %}

唉,不是在for循环的上下文中使用逗号分隔的值,而是使用每个字符。

结果:

#!/usr/bin/python

#
# stolen from https://stackoverflow.com/questions/42090084/how-can-i-unit-test-jinja2-template-logic
# but real working info found here: http://matthiaseisen.com/pp/patterns/p0198/
#


import os
import jinja2


def render(tpl_path, context):
    path, filename = os.path.split(tpl_path)
    return jinja2.Environment(
        loader=jinja2.FileSystemLoader(path or './')
    ).get_template(filename).render(context)


context = {  # your variables to pass to template
    'extendedKeyUsage': 'true',
    'TLS_IP_SANS': '10.1.17.101',
#    'TLS_DNS_SANS': 'test.crapco.labs'
    'TLS_DNS_SANS': 'test.crapco.labs, www.crapco.labs, a.crapco.lab'
}

filename = '/root/20160921/roles/ansible-role-CA/templates/crtExtendedUse.j2'

rendered = render(filename, context)

print "this is the rendered template %s." % rendered

如何获得完整的字符串?

1 个答案:

答案 0 :(得分:0)

答案是我对要循环的列表/数组的错误理解。 使用以下上下文计算得很好:

context = {  # your variables to pass to template
    'extendedKeyUsage': 'true',
    'TLS_IP_SANS': ['10.1.17.101'],
    'TLS_DNS_SANS': ['test.crapco.labs', 'www.crapco.labs', 'a.crapco.lab']
}

现在输出符合预期:

this is the rendered template 
subjectAltName = IP:10.1.17.101, DNS:test.crapco.labs, DNS:www.crapco.labs, DNS:a.crapco.lab, IP:127.0.0.1
extendedKeyUsage = clientAuth,serverAuth
.