一、jinja2 for循环
在jinja2中的for循环,跟python中的for循环基本上是一模一样的。也是for…in…的形式。并且也可以遍历所有的序列以及迭代器。但是唯一不同的是,jinja2中的for循环没有break和continue语句。
但是在Jinja2模板中,没有continue和break语句,所以我们不能使用他们来控制我们的循环。但是Jinja2模板给我们提供了for循环中的其他一些变量。
变量 | 作用 |
loop.index0 | 当前迭代对象的索引,从0开始 |
loop.index | 当前迭代对象的索引,从1开始 |
loop.revindex | 当前循环的反向索引,比如序列的长度为5,那么第一次循环这个值就为5,接下来每次减一 |
lopp.revindex0 | 当前循环的反向索引,从0开始,所以第一次的值为loop.length-1 |
loop.first | 是否为第一次迭代,反回True或False |
loop.last | 是否为最后一次迭代,返回True或False |
loop.length | 序列的长度 |
loop.previtem | 当前循环值得上一个值,如果为序列中的第一个值,那么上一个值就为空 |
loop.nextitem | 当前循环值得下一个值,如果为序列中的最后一个值,那么下一个值就为空 |
loop.cycle() | 辅助循环,看下面的例子 |
for循环基本语法如下:
{ % for 迭代变量 in 可迭代对象 % }
{{ 迭代变量 }}
{ % endfor % }
案例一:为远程主机生成服务器列表,该列表从192.168.37.201 web01.magedu开始,到192.168.37.211 web11.magedu结束。在该案例中,手工一条条添加10条记录明显不是我们期望的结果,这里需要用For循环通过模板批量生成对应的配置文件。我们具体看下对应的Jinja2文件该如何编写。
{% for id in range(201,211) %}
192.168.37.{{ id }} web{{ "%02d"|format(id-200) }}.magedu
{% endfor %}
最终执行结果,如下所示:
192.168.37.201 web01.magedu
192.168.37.202 web02.magedu
192.168.37.203 web03.magedu
192.168.37.204 web04.magedu
192.168.37.205 web05.magedu
192.168.37.206 web06.magedu
192.168.37.207 web07.magedu
192.168.37.208 web08.magedu
192.168.37.209 web09.magedu
192.168.37.210 web10.magedu
第二行涉及一定的Python基础,这里额外解释下:
1、{{ id }}:提取for循环中对应变量id的值
2、“%02d”:调用的是Python内置的字符串格式化输出,然后将结果通过管道符"|"传递给format函数做二次处理,Jinja支持简单的算法运算符,但不经常用到,这里format(id-200)表示id的值减去200
3、%2d是将数字按宽度为2,采用右对齐方式输出,若数据位数不到2位,则左边补空格。%02d,和%2d差不多,只不过左边补0。%-2d将数字按宽度为2,采用左对齐方式输出,若数据位数不到2位,则右边补空格。%.2d 输出整形时最少输出2位,如不够前面以0占位。如输出2时变成02,200时只输出200。输出浮点型时(%.2f)小数点后强制2位输出
比如:
num = 1
print("%d" % (num))结果为: (1)
print("%2d" % (num))结果为: ( 1)
print("%02d" % (num))结果为: (01)
print("%-2d" % (num))结果为: (1 )
print("%.2d" % (num))结果为: (01)
print("%.2d" % (200))结果为: (200)
print('%.2f' % 3.1415926) 结果为: (3.14)
print('%.2f' % 3.1455926) 结果为:3.15
print('%.2f' % 3.1465926) 结果为:3.15
案例二:
1、换行
{% for i in [3,5,2,7] %}
{{ i }}
{% endfor %}
执行结果
3
5
2
7
2、不换行数字之间没有空格
{% for i in [3,5,2,7] -%}
{{ i }}
{%- endfor %}
执行结果
3527
3、不换行且数字之间有空格
{% for i in [3,5,2,7] -%}
{{ i }}{{ ' ' }}
{%- endfor %}
执行结果
3 5 2 7
4、字符间的连接符
{% for key,val in {'name':'zjy','age':18}.iteritems() %}
{{ key~ ':' ~val }}
{% endfor %}
执行结果
age:18
name:zjy
5、使用range
{% for i in range(5) %}
{{i}}
{% endfor %}
执行结果
0
1
2
3
4
6、 使用loop.index获取每次循环的次数
{% for i in [2,3,6,1] %}
{{ i~'----'~loop.index }}
{% endfor %}
执行结果
2----1
3----2
6----3
1----4
二、jinja2 if条件
if条件基本语法如下:
{% if variable is defined %}
value of variable: {{ variable }}
{% else %}
variable is not defined
{% endif %}
案例一:根据不同的mysql版本,生成相应版本的配置文件。