我在程序开始时按如下方式配置Jinja环境:
jinja_env = Environment(
loader = FileSystemLoader(
build_methods.get_absolute_path(
absolute_path_of_this_file,
constants.JINJA_TEMPLATES_PATH
)
),
trim_blocks = True,
lstrip_blocks = True,
keep_trailing_newline = False
)
我有以下Jinja模板:
{% for alter_table_column in alter_table_list -%}
ALTER TABLE {{ schema_name }}.{{ table_name }} DROP COLUMN {{ alter_table_column }};
{% endfor -%}
在文件末尾有一个未以SO呈现的换行符。 我重复一遍。我的模板是4行。在文件末尾,模板的3行和换行的第四行。
运行程序时,模板将运行,并且输出看起来像这样:
ALTER TABLE table DROP COLUMN column1;
ALTER TABLE table DROP COLUMN column2;
ALTER TABLE table DROP COLUMN column3;
ALTER TABLE table DROP COLUMN column4;
在此文件末尾带有 2个换行符(因此无法渲染...)。
我无能为力,因为我什么都不做。总会出现此额外的新行,这会影响随后的操作,这些操作会将文件的行读取为列表。这样的列表的末尾有一个空字符串。
我只能做一件事情来使它工作,但我发现这很丑。
{% for alter_table_column in alter_table_list -%}
ALTER TABLE {{ schema_name }}.{{ table_name }} DROP COLUMN {{ alter_table_column }};{% if not loop.last %}{{ '\n' }}{% endif %}
{% endfor -%}
这有效,并且渲染正确,文件末尾只有一行。
我已经不知所措了。我已经搜索了关于该主题的每篇SO帖子,并且我当然读过documentation来进行空白控制。 -%
块末尾的endfor
应该去掉空白。我在程序中用于渲染Jinja模板的所有调用都使用相同的jinja_env
,并且在创建后不修改此环境。我读过,创建后修改环境可能会导致问题。
我呈现模板的功能如下:
def render_templates(jenv, template_file_name, render_args):
template = jenv.get_template(template_file_name)
return template.render(render_args)
def render_templates_to_file(jenv, template_file_name, resolved_template_filename, render_args):
with open(resolved_template_filename, constants.WRITE_OPTION) as outfile:
print(render_templates(jenv, template_file_name, render_args), file = outfile)
为了确定,我检查了用于渲染Jinja模板的列表,它们没有多余的元素或空白元素。
我只希望这些for循环使用文件末尾的一行而不是两行来呈现模板。