Jinja2 基本概念及简单使用

官方文档

模板包含变量表达式,这两者在模板求值的时候会被替换为值。模板中 还有标签,控制模板的逻辑。模板语法的大量灵感来自于 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()的方法,该方法在调用dictkeywords参数时填充模板。

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")
发布了3 篇原创文章 · 获赞 1 · 访问量 651

猜你喜欢

转载自blog.csdn.net/q965844841qq/article/details/105532428