Jinja2是一种基于Python的模板引擎

Jinja2是一种基于Python的模板引擎,用于生成HTML或其他文本文件。它具有简洁的语法和强大的功能,使得模板的编写和维护变得简单而高效。

Jinja2的语法主要包括以下几个部分:
变量:

使用大括号{{ variable }}来定义变量,可以在模板中直接输出变量的值。
控制结构:

Jinja2支持条件语句、循环语句等控制结构,可以用来实现条件判断、列表遍历等操作。
过滤器:

使用管道符|来定义过滤器,可以对变量的值进行格式化、字符串处理等操作。
模板继承:

通过继承其他模板,可以在子模板中重用父模板的代码和布局。

安装方式

python 复制代码
sudo easy_install Jinja2
sudo pip install Jinja2

变量

应用把变量传递到模板,你可能在模板中弄混。变量上面也可以有你能访问的属性或元 素。变量看起来是什么,完全取决于应用提供了什么。

你可以使用点( . )来访问变量的属性,作为替代,也可以使用所谓的"下标"语 法( [] )。下面的几行效果是一样的:

bash 复制代码
{{ foo.bar }}
{{ foo['bar'] }}

空白控制

默认配置中,模板引擎不会对空白做进一步修改,所以每个空白(空格、制表符、换行符 等等)都会原封不动返回。如果应用配置了 Jinja 的 trim_blocks ,模板标签后的 第一个换行符会被自动移除(像 PHP 中一样)。

此外,你也可以手动剥离模板中的空白。当你在块(比如一个 for 标签、一段注释或变 量表达式)的开始或结束放置一个减号( - ),可以移除块前或块后的空白:

bash 复制代码
{% for item in seq -%}
    {{ item }}
{%- endfor %}

赋值

在代码块中,你也可以为变量赋值。在顶层的(块、宏、循环之外)赋值是可导出的,即 可以从别的模板中导入。

赋值使用 set 标签,并且可以为多个变量赋值:

bash 复制代码
{% set navigation = [('index.html', 'Index'), ('about.html', 'About')] %}
{% set key, value = call_something() %}

包含

include 语句用于包含一个模板,并在当前命名空间中返回那个文件的内容渲 染结果:

bash 复制代码
{% include 'header.html' %}
    Body
{% include 'footer.html' %}

For

bash 复制代码
<h1>Members</h1>
<ul>
{% for user in users %}
  <li>{{ user.username|e }}</li>
{% endfor %}
</ul>

if

bash 复制代码
{% if users %}
<ul>
{% for user in users %}
    <li>{{ user.username|e }}</li>
{% endfor %}
</ul>
{% endif %}



Tips:

Jinja2去除不必要的空格

{{- ... -}}:去除变量前后的空格

{%- ... -%}:去除标签前后的空格

Jinja2常用内置过滤器

  • 转成字符串:| string
  • 转成整型:| int
  • 转成小写:| lower
  • 转成大写:| upper
  • 将''替换成 '-':| replace('', '-')
  • 拼接字符串:| join(" ")

Jinja2格式化渲染,使用format

bash 复制代码
{{- "hostname %s" | format(hostname) }}

Jinja2模板渲染因循环或判断过多导致渲染慢的问题,可以减少模板中的逻辑,在python中处理数据

我们可以自定义函数然后注入到jinja2里面功能模板使用

bash 复制代码
def sortByIntfNameKey(res):
    return sorted(res, key=lambda x: float(ifNameToId(x[0]).replace('-', '.')))
tmplDir = os.path.abspath(os.path.join(os.environ.get('CLISH_TARGET'), 'tmpl'))
            env = Environment(
                loader=FileSystemLoader(tmplDir),
                extensions=['jinja2.ext.do'],
            )
            env.trim_blocks = True
            env.lstrip_blocks = True
            #env.rstrip_blocks = True
            # 自定义过滤器
            env.filters['sortByIntfNameKey'] = sortByIntfNameKey

举个例子:

模板文件version.j2

bash 复制代码
{% set version = res['text'] %}
{% set version = cli_version %}
{% set fversion = version['fversion'] %}
{{- "F Version: %s\n" |  format(fversion) }}
{{- "C Version      : %s" | format(version) }}
python 复制代码
def showversion(self):
        config = configparser.ConfigParser()
        config.read(CFG_PATH, encoding="utf-8")
        cli_version=config.get('VersionInfo','version')
        res = self.client.requests(url='/xxx/system/info')
        fversion = res['text']['release_version']
        result = self.render(template='version.j2',res=res, fversion =fversion ,cli_version=cli_version)
        print(result)
        return checkRes(res)

http://docs.jinkan.org/docs/jinja2

相关推荐
&岁月不待人&15 分钟前
Kotlin by lazy和lateinit的使用及区别
android·开发语言·kotlin
StayInLove18 分钟前
G1垃圾回收器日志详解
java·开发语言
无尽的大道26 分钟前
Java字符串深度解析:String的实现、常量池与性能优化
java·开发语言·性能优化
爱吃生蚝的于勒30 分钟前
深入学习指针(5)!!!!!!!!!!!!!!!
c语言·开发语言·数据结构·学习·计算机网络·算法
binishuaio39 分钟前
Java 第11天 (git版本控制器基础用法)
java·开发语言·git
zz.YE41 分钟前
【Java SE】StringBuffer
java·开发语言
就是有点傻1 小时前
WPF中的依赖属性
开发语言·wpf
洋2401 小时前
C语言常用标准库函数
c语言·开发语言
进击的六角龙1 小时前
Python中处理Excel的基本概念(如工作簿、工作表等)
开发语言·python·excel
wrx繁星点点1 小时前
状态模式(State Pattern)详解
java·开发语言·ui·设计模式·状态模式