jinja2如何删除尾随换行符
Posted
技术标签:
【中文标题】jinja2如何删除尾随换行符【英文标题】:jinja2 how to remove trailing newline 【发布时间】:2016-08-20 15:17:48 【问题描述】:我正在使用 jinja 2 输出 yaml 文件,但似乎无法摆脱尾随换行符和 for 循环的结尾。例如下面的
- request:
path: path
headers:
origin: 'somedomain.com'
user-agent: 'agent'
referer: 'some.domain.com'
authority: 'somedomain.com'
querystring:
% for key, value in querystring.items() -%
key : ' value '
% endfor %
response:
content:
file: content
给我输出:
- request:
path: /some/path
headers:
origin: 'somedomain.com'
user-agent: 'agent'
referer: 'somedomain.com'
authority: 'somedomain.com'
querystring:
postcode: 'xxxxxx'
houseNo: '55'
response:
content:
file: address.json
在 houseNo 之后多了一个不需要的空行。如何摆脱这条线?
【问题讨论】:
【参考方案1】:更改循环以从输出的顶部和底部去除空格(注意for
循环关闭处的额外-
):
% for key, value in querystring.items() -%
key : ' value '
%- endfor %
在我的测试中(使用https://github.com/abourguignon/jinja2-live-parser),-
必须在第一个 %
之后,而不是在最后一个之前才能达到您的要求。
文档:https://jinja.palletsprojects.com/en/latest/templates/#whitespace-control
【讨论】:
是的,你是对的。预先添加-
而不是附加会保留缩进并且不会弄乱下一行中的空格。
正确,直到我再次玩弄它时才记得这个细节。
对我来说,这会将所有键:值对放在一行上。我不明白为什么这个答案被接受了。
只是因为我没有在任何地方看到这部分解释,我想我会添加它。在 for 循环的第一行的第二个百分号之前放置 -
会删除添加行之前的换行符。在 for 循环的最后一行的第一个百分号之后放置 -
会删除添加行之后的换行符。将它们结合起来,你会得到 0 个换行符。只有一个,你只能得到一个换行符来分隔一行,但每行之间没有额外的换行符。在我的例子中,我想在循环之前而不是在每个元素之后换行,所以我把-
放在endfor
之前。希望这会有所帮助【参考方案2】:
我认为您可以使用whitespace control 功能摆脱它。因此我会将endfor
块修改为% endfor -%
看看是不是这样!
【讨论】:
【参考方案3】:对于那些到达这里的使用 Flask 的人来说,这些行对我有用:
app = Flask(__name__)
app.jinja_env.lstrip_blocks = True
app.jinja_env.trim_blocks = True
【讨论】:
也许您可以通过说明您可以在 Environment 对象中设置它来使您的答案更通用:Environment(trim_blocks=True, lstrip_blocks=True)
【参考方案4】:
我找到了解决这个问题的方法:
- request:
path: path
headers:
origin: 'somedomain.com'
user-agent: 'agent'
referer: 'some.domain.com'
authority: 'somedomain.com'
querystring: >-
% for key, value in querystring.items() -%
key : ' value '
% endfor %
response:
content:
file: content
>
, |
: "clip": 保持换行,去掉尾随的空行。
>-
, |=
: "strip": 去掉换行,去掉尾随的空行。
>+
, |+
: "keep": 保持换行,保持尾随空行。
谢谢史蒂夫·贝内特的帖子: In YAML, how do I break a string over multiple lines?
【讨论】:
谢谢你,帮助我解决了我的问题,我必须使用的正确运算符是“|-”(管道减号),现在我的多行字符串已正确传输到我的 json 文件,除最后一行以外的所有行结束。【参考方案5】:接受的答案只是解决方案的一半,因为它删除了所有个换行符。
您可以通过首先删除所有换行符来避免尾随换行符(在 for 循环中使用 -%
和 %-
的减号),然后在正确的位置插入所需的换行符(使用 loop.last
条件)。
以下模板将字典 d 呈现为 JSON 文本:
% for key, value in d.items() -%
" key ": " value " ",
" if not loop.last
%- endfor %
对于d = 'a':'1', 'b':'2'
,模板呈现为
"a": "1",
"b": "2"
【讨论】:
【参考方案6】:您可以禁止渲染以下行:
<% for ... %>
<% endfor %>
<% if ... %>
<% endif %>
通过在您的 jinja2 环境中设置 trim_blocks=True 和 lstrip_blocks=True。见下面的例子,来自their docs的信息
context = 'querystring': querystring, 'path': path, 'content': content
jinja_env = jinja2.Environment(
loader=jinja2.FileSystemLoader('templates/'),
trim_blocks=True,
lstrip_blocks=True
)
print(jinja_env.get_template('my_template.yaml').render(context))
【讨论】:
以上是关于jinja2如何删除尾随换行符的主要内容,如果未能解决你的问题,请参考以下文章