模板包含变量或表达式,这两者在模板求值的时候会被替换为值。模板中 还有标签,控制模板的逻辑。模板语法的大量灵感来自于 Django 和 Python 。
基本语法:
- 语句
{% ... %}
- 变量
{{ ... }}
- 注释
{# ... #}
Jinja2 Custom Filters
自定义筛选器只是常规 Python 函数,将筛选器的左侧作为第一个参数,并将参数作为额外的参数或关键字参数传递给筛选器。
可以将自己写的函数、导入的模块等更新到环境中,进而在 Jinja2 中使用。
Jinja2 的默认 filter 是一个字典,查看方式:Environment.filters
使用方法:通过更新environment中的filters字典,在模板环境中注册。
env = Environment(loader=FileSystemLoader('./templates/'))
env.filters['datetimeformat'] = datetimeformat
在模板中使用:
{{ article.pub_date|datetimeformat }}
# 传参方法
# {{ 42| myfilter(23) }} == myfilter(42, 23)
将 ipaddress.IPv4Interface 作为过滤器
# 按照jinja2自定义过滤器传参方法定义一个函数,获取其他模块的属性 **getattr**
def custom_ipaddr(ipaddress,operation):
from ipaddress import IPv4Interface
ipadd = IPv4Interface(ipaddress)
attr = getattr(ipadd,operation)
return attr
# 添加到环境中
env = Environment(loader=FileSystemLoader('./roles/cmw7/templates/'))
env.filters['custom_ipaddr'] = custom_ipaddr
# 在模板中使用
# cat filter_test.j2
{{ 192.168.1.1/24 | custom_ipaddr('netmask') }}
Template Inheritance in Jinja
在为网络配置创建更大、功能更多的模板文件时,可以使用模板继承,将模板分解开来。比如,创建 VLAN、interface 、OSPF 等各自独立的模板,这样灵活性更高,模板继承可以将这些独立的模板文件连接在一起。
使用include
语句可以将一个模板完全插入到另一个模板中:
{% include 'vlans.j2' %}
另一种继承的方法是使用bolck
语句,子模板引用父模板后,可以指定其中的某些部分,如果子模板中不存在,则使用父模板中的值。父模板也可以将 bolck 留空,子模板直接填充内容。
# 父模板,cat father.j2
This is father template.
{% block test %}
This is line can be replaced.
{% endblock %}
This is father template.
# 子模板,cat children.j2
{% extends 'father.j2' %}
{% block test %}
This is children template.
{% endblock %}
# 渲染结果,block 被替代,其他内容不变。
This is father template.
This is children template.
This is father template.
宏 Macro(相当于函数)
# cat test.j2
{% macro testfunc() %}
test string
{% endmacro %}
基本用法
创建和渲染模板的最基本方法是通过Template
,通过创建一个Template
的实例,
会得到一个新的模板对象,模板对象有一个render()
的方法,该方法在调用dict或keywords参数时填充模板。
tmp = Template('hello {{ name}}')
tmp.render(name = '111')
一般用法
# 首先告诉Jinja2模块,jinja模板文件路径在哪?(如当前目录)
jinja_loader = FileSystemLoader('./')
# 然后定义一个环境,告诉jinja2,从哪里调用模板
env = Environment(loader=jinja_loader)
# 之后通过 get_template 获取并载入模板
jinja_template = env.get_template('jinja2.j2')
# 最后传入参数,渲染模板
final = jinja_template.render("vars")