首页 > 解决方案 > Jinja2 渲染模板 - 忽略没有值的字段

问题描述

我有一个 default.yaml,它有一些属性,例如:

app_conf:
   port: 443
   ping_port: 444

我有一个 application.conf,它看起来像:

...
master_port "{{ app_conf.port }}";
pingcheck_port "{{ app_conf.ping_port }}";
...

我使用下面的 python 代码将 application.conf 中的字段替换为 default.yaml 中的字段

configuration = yaml.load(open('conf/default.yaml'))['app_conf']
template = env.get_template("application.conf")
confReplaceOutput = template.render(app_conf=configuration)

现在,如果 {{app_conf.ping_port}} 的值在 default.yaml 文件中不可用,则呈现的输出为:

    pingcheck_port:;

我希望输出是

pingcheck_port "{{ app_conf.ping_port }}";

那么如何配置 jinja2 以忽略对 yaml 文件中没有定义的字段的替换?

标签: pythonjinja2

解决方案


我会使用 if、else 和 raw 块

{% if app_conf is defined and app_conf.ping_port is defined -%}
    pingcheck_port "{{ app_conf.ping_port }}";
{% else %}
    {%raw-%}
        pingcheck_port "{{ app_conf.ping_port }}";
    {%endraw%}
{% endif %}

推荐阅读