首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >10-jinja2

10-jinja2

原创
作者头像
小朋友呢
修改2020-01-14 17:51:18
2.4K0
修改2020-01-14 17:51:18
举报

Jinja2模板

解释

它的作用与php解释器一样,把带有php代码的源文件,解析成html

jinja2是把带有jinja2语法的文件解析成对应的目标内容

使用

使用jinja2模块渲染文件

from jinja2 import Environment as Env ,FileSystemLoader as FS
#指定本地模板目录
env = Env(loader=FS('/jinja2'))
#加载模板文件
template = env.get_template('ceshi.html')
#渲染模板,可以传递变量
print(template.render(names=['lala','haha']).replace('\t','').lstrip('\n'))

分隔符

{{ EXPR }}

用于装载表达式,比如变量,运算表达式,比较表达式。

{% EXPR %}

用于装载控制语句,比如if,for等。

{# #}

用于装载注释,模板文件中的注释不会包含在最终生成文件中。

For语句

语法

{%for … %}用于声明循环,{% endfor %} 表示结束。

1.生成hosts文件信息

{% for host in groups['all'] %}
{{ hostvars[host]['ansible_default_ipv4']['address'] }} {{ hostvars[host]['ansible_fqdn'] }} {{ hostvars[host]['ansible_hostname'] }}
{% endfor %}

2.带条件的循环

{% for myuser in users if not myuser == "Mario" %}
{{loop.index}} - {{ myuser }}
{% endfor %} 

myuser会遍历users变量中所有值,除了Mario。

loop.index代表当前循环的索引号,从1开始到最后循环体的数量。例如循环体有12个,那么loop.index代表1,2,3..12。

假如users变量为:Tom,Eric,Mario,Alice

输出结果为:

1 - Tom
2 - Eric
4 - Alice

loop扩展

loop.index

当前循环操作为整个循环的第几次循环,序号从1开始

loop.index0

当前循环操作为整个循环的第几次循环,序号从0开始

loop.revindex

当前循环操作距离整个循环结束还有几次,序号到1结束

loop.revindex0

当前循环操作距离整个循环结束还有几次,序号到0结束

loop.first

当操作迭代对象中的第一个元素时,此变量的值为true

loop.last

当操作迭代对象中的最后一个元素时,此变量的值为true

loop.length

迭代对象的长度

loop.depth

当使用递归的循环时,当前迭代所在的递归中的层级,层级序号从1开始

loop.depth0

当使用递归的循环时,当前迭代所在的递归中的层级,层级序号从0开始

loop.cycle()

这是一个辅助函数,通过这个函数我们可以在指定的一些值中进行轮询取值。

参考:http://jinja.pocoo.org/

3.遍历一个列表

{% for i in [3,1,7,8,2] %}
{{ i }}
{% endfor %}

{% for i in [7,1,5,3,9] if i > 3 %}
  {{ i }}
{% endfor %}

4.嵌套循环

{% for i in [7,1,5,3,9] if i > 3 %}
{% for n in [1,2,5,3,9] if n < 3 %}
  {{ i }} -  {{ n }}
{% endfor %}
{% endfor %}

5.指定循环次数

range(3)代表 1 2 3,循环三次。

{% for i in range(3) %}
	172.16.{{ i }}.110
{% endfor %}

6.指定开始、结束、步长

range(1,4,2),从1开始,到4结束,步长2.

{% for i in range(1,4,2) %}
{{ i }}	
{% endfor %}

if语句

1.单分支if

如果Success变量是true,那么输出变量ok。

{% if success %}
{{ ok }}
{% endif %}

2.if-else

配置mysql端口,如果PORT定义了端口,那么使用该值,否则使用默认3306.

{% if PORT %}
bind-address=0.0.0.0:{{ PORT }}
{% else %}
bind-address=0.0.0.0:3306
{% endif %}

3.多分支if

{% if 条件一 %}
...
{% elif 条件二 %}
...
{% elif 条件N %}
...
{% endif %}

4.多分支if-else

{% if 条件一 %}
...
{% elif 条件N %}
...
{% else %}
...
{% endif %}

5.循环中使用if

{% for i in range(1,100) %}
  {% if i % 2 == 0 %}
    {{ i }}
  {%endif%}
{% endfor %}

参考:https://www.programcreek.com/python/example/1632/jinja2.Environment

过滤器

对内容进行特定的处理

格式化输出

{{ output | to_json }}

使用JSON格式输出。

{{ output | to_yaml}}

使用YAML格式输出。

{{ output | to_nice_json}}

使用人们更加可读的JSON格式输出。

{{ output | to_nice_yaml}}

使用人们更加可读的YAML格式输出。

{{ output | from_json}}

把output当做JSON格式解析。

{{ output | from_yaml}}

把output当做YAML格式解析。

when语句中使用的表达式就是Jinja2表达式,用于测试返回值。

测试的返回值包括:failedchangedsucceededskipped

示例:

tasks:
 - debug: msg=”the execution was aborted”
   when: returnvalue | failed -> 相当于  when: returnvalue is failed

字符串操作过滤器

将字符串转换成纯大写

"{{ testvar | upper }}"

将字符串转换成纯小写

"{{ testvar | lower }}"

将字符串变成首字母大写,之后所有字母纯小写

"{{ testvar | capitalize }}"

将字符串反转

"{{ testvar | reverse }}"

返回字符串的第一个字符

"{{ testvar | first }}"

返回字符串的最后一个字符

"{{ testvar | last }}"

将字符串开头和结尾的空格去除

"{{ testvar1 | trim }}"

将字符串放在中间,并且设置字符串的长度为30,字符串两边用空格补齐30位长

"{{ testvar1 | center(width=30) }}"

返回字符串长度,length与count等效,可以写为count

"{{ testvar2 | length }}"

将字符串转换成列表,每个字符作为一个元素

"{{ testvar3 | list }}"

将字符串转换成列表,每个字符作为一个元素,并且随机打乱顺序

"{{ testvar3 | shuffle }}"

在随机打乱顺序时,将ansible_date_time.epoch的值设置为随机种子

"{{ testvar3 | shuffle(seed=(ansible_date_time.epoch)) }}"

数字操作过滤器

ansible中,字符串和整形不能直接计算,比如{{ 8+'8' }}会报错,所以,我们可以把一个值为数字的字符串转换成整形后再做计算

将对应的值转换成int类型

"{{ 8+('8' | int) }}"

使用int(default=6)或者int(6)时,如果无法转换则返回指定值6

"{{ 'a' | int(default=6) }}"

将对应的值转换成浮点型,如果无法转换,默认返回'0.0'

"{{ '8' | float }}"

当对应的值无法被转换成浮点型时,则返回指定值'8.8'

"{{ 'a' | float(8.88) }}"

获取对应数值的绝对值

"{{ testvar4 | abs }}"

四舍五入

"{{ 12.5 | round }}"

取小数点后五位

"{{ 3.1415926 | round(5) }}"

从0到100中随机返回一个随机数

"{{ 100 | random }}"

从5到10中随机返回一个随机数

"{{ 10 | random(start=5) }}"

从5到15中随机返回一个随机数,步长为3

"{{ 15 | random(start=5,step=3) }}"

从0到15中随机返回一个随机数,这个随机数是5的倍数

"{{ 15 | random(step=5) }}"

0~15间返回一个随机数,随机数种子是facts->ansible_date_time.epoch

"{{ 15 | random(seed=(ansible_date_time.epoch)) }}"

列表操作过滤器

返回列表长度,length与count等效,可以写为count

"{{ testvar7 | length }}"

返回列表中的第一个值

"{{ testvar7 | first }}"

返回列表中的最后一个值

"{{ testvar7 | last }}"

返回列表中最小的值

"{{ testvar7 | min }}"

返回列表中最大的值

"{{ testvar7 | max }}"

将列表升序排序输出

"{{ testvar7 | sort }}"

将列表降序排序输出

"{{ testvar7 | sort(reverse=true) }}"

返回纯数字非嵌套列表中所有数字的和

"{{ testvar7 | sum }}"

如果列表中包含列表,那么使用flatten可以'拉平'嵌套的列表

"{{ testvar8 | flatten }}"

如果列表中嵌套了列表,那么将第1层的嵌套列表‘拉平’

"{{ testvar8 | flatten(levels=1) }}"

过滤器都是可以自由结合使用的,就好像linux命令中的管道符一样

"{{ testvar8 | flatten | max }}"

将列表中的元素合并成一个字符串

"{{ testvar9 | join }}"

将列表中的元素合并成一个字符串,每个元素之间用指定的字符隔开

"{{ testvar9 | join(',') }}"

从列表中随机返回一个元素, 不能使用start和step参数

"{{ testvar9 | random }}"

从列表中随机返回一个元素

"{{ testvar9 | random(seed=(ansible_date_time.epoch)) }}"

随机打乱顺序列表中元素的顺序

"{{ testvar9 | shuffle }}"

在随机打乱顺序时,将ansible_date_time.epoch的值设置为随机种子

"{{ testvar9 | shuffle(seed=(ansible_date_time.epoch)) }}"

将列表中的每个元素变成纯大写

"{{ testvar10 | upper }}"

将列表中的每个元素变成纯小写

"{{ testvar10 | lower }}"

去掉列表中重复的元素,重复的元素只留下一个

"{{ testvar11 | unique }}"

去掉列表中重复的元素,重复的元素只留下一个

"{{ testvar11 | unique }}"

将两个列表合并,重复的元素只留下一个, 也就是求两个列表的并集

"{{ testvar11 | union(testvar12) }}"

取出两个列表的交集,重复的元素只留下一个

"{{ testvar11 | intersect(testvar12) }}"

两个列表的交集在列表1中的补集

"{{ testvar11 | difference(testvar12) }}"

去除两个列表的交集,剩余的元素

"{{ testvar11 | symmetric_difference(testvar12) }}"

表达式

比较运算

逻辑运算

算数运算

成员运算

{{ 1 == 1 }}

{{ (2 > 1) or (1 > 2) }}

{{ 3 + 2 }}

{{ 1 in 1,2,3,4 }}

{{ 2 != 2 }}

{{ (2 > 1) and (1 > 2) }}

{{ 3 - 4 }}

{{ 1 not in 1,2,3,4 }}

{{ 2 > 1 }}

{{ not true }}

{{ 3 * 5 }}

{{ 2 >= 1 }}

{{ not True }}

{{ 2 ** 3 }}

{{ 2 < 1 }}

{{ not false }}

{{ 7 / 5 }}

{{ 2 <= 1 }}

{{ not False }}

{{ 7 // 5 }}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Jinja2模板
    • 解释
      • 使用
        • 分隔符
        • For语句
          • 语法
            • 1.生成hosts文件信息
              • 2.带条件的循环
                • loop扩展
              • 3.遍历一个列表
                • 4.嵌套循环
                  • 5.指定循环次数
                    • 6.指定开始、结束、步长
                    • if语句
                      • 1.单分支if
                        • 2.if-else
                          • 3.多分支if
                            • 4.多分支if-else
                              • 5.循环中使用if
                              • 过滤器
                                • 格式化输出
                                  • 字符串操作过滤器
                                    • 数字操作过滤器
                                      • 列表操作过滤器
                                        • 表达式
                                        领券
                                        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档