searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

Jinja2 模板使用简析

2023-05-26 02:31:58
114
0

简介

Jinja2是由Python实现的被广泛应用的模版引擎,他的设计思想来源于Django的模板引擎,并扩展了其语法和一系列强大的功能。由于性能快,安全性高,被各种应用框架广泛使用,尤其是Python的Web项目。官网地址:http://jinja.pocoo.org/

相比其他模板语言,有以下几个优点:

  • 比较灵活,提供了控制结构,表达式和继承等;
  • 简便,只有控制结构,不允许模板中有太多的业务逻辑;
  • 性能好,模板的可读性强。

为了实现产品的自动化部署,在不同型号的服务器中对产品的标准化配置,选择 Jinja2 作为模板语言,可以达到事半功倍的目的。

本文简单介绍 Jinja2 模板的使用,对于其实现,可参考官网

语法

Jinja2 主要有三种语法:

  • 控制结构 {% %}
  • 变量取值 {{ }}
  • 注释 {# #} ; 模板渲染的时候会忽视这中间的值。

过滤器

过滤器可以理解为 Jinja2 的内置函数和字符串处理函数等,变量可以使用它们进行修改或转换。常用的过滤器有:

  • safe: 渲染时值不转义;
  • capitialize: 把值的首字母转换成大写,其他子母转换为小写;
  • lower: 把值转换成小写形式;
  • upper: 把值转换成大写形式;
  • title: 把值中每个单词的首字母都转换成大写;
  • trim: 把值的首尾空格去掉;
  • striptags: 渲染之前把值中的HTML标签删掉;
  • join: 拼接多个值为字符串;
  • replace: 替换字符串的值;
  • round: 默认对数字进行四舍五入,也可以用参数进行控制;
  • int: 把值转换成整型。

对于配置文件使用的模板,除了上面的字符串、数值过滤器,常用的还有列表、字典使用的过滤器:

  • first/last: 返回列表第/最后一个元素;
  • sum: 列表求和;
  • sort: 列表排序,默认升序排序;
  • lenght/count: 返回列表长度;
  • grouby: 列表分组。

测试器

测试器用来测试一个变量或者表达式,返回一个布尔值,关键字是 is. 常用的测试器有:

  • callable: 是否可调用;
  • defined: 是否已经被定义了;
  • escaped: 是否已经被转义了;
  • uppe: 是否全是大写;
  • lower: 是否全是小写;
  • string: 是否是一个字符串;
  • sequence: 是否是一个序列;
  • number: 是否是一个数字;(
  • odd: 是否是奇数;
  • even: 是否是偶数。

控制语句

Jinja2的控制语句主要包括条件控制语句 if,和循环控制语句 for,语法接近 python。更多详细使用参考 Jinja2  模板设计者文档 — Jinja2 中文手册 2.8 documentation (ainoob.cn)

示例

如下实现了一个简单的自动化适配VPP的配置模板,可根据一个简单的yaml配置文件,轻松生成相应的VPP的配置文件:

unix {
        nodaemon
        cli-prompt {{ cli_prompt | default("cli-tgw#") }}
        cli-no-banner
        log /var/log/vpp/vpp.log
        full-coredump
        cli-listen /run/vpp/cli.sock
        gid vpp
        exec /etc/vpp/init.dat
}
api-trace {
        on
}
api-segment {
        gid vpp
}
socksvr {
        default
}
 
cpu {
        main-core {{ main_core | default(0) }}
        corelist-workers {{ workers | default("1-8") }}
}
 
dpdk {
        socket-mem {{ socket_mem | default(65535) }}
 
{% if num_mbufs is not defined %}
{% set num_mbufs="12600" %}
{% endif %}
        num-mbufs {{ num_mbufs }}
 
        dev default {
{% if dev_rx_queues is defined %}
                num-rx-queues {{ dev_rx_queues }}
{% endif %}
                num-rx-desc {{ dev_rx_desc|default(512) }}
                num-tx-desc {{ dev_tx_desc|default(512) }}
        }
{% if not tx_offload %}
        no-tx-checksum-offload
{% endif %}
{% if not multi_seg %}
        no-multi-seg
{% endif %}
 
{% for iface in nics %}
        {% if iface.pci_id %}
        dev {{ iface.pci_id }} {
                name {{ iface.name }}
        }
        {% endif %}
{% endfor %}
 
        uio-driver {{ uio_driver | default("igb_uio") }}
}
 
heapsize {{ heapsize | default("2G") }}
 
0条评论
0 / 1000
l****n
3文章数
1粉丝数
l****n
3 文章 | 1 粉丝