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

相关推荐
长河1 小时前
Java开发者LLM实战——LangChain4j最新版教学知识库实战
java·开发语言
Cyan_RA91 小时前
SpringMVC @RequestMapping的使用演示和细节 详解
java·开发语言·后端·spring·mvc·ssm·springmvc
再见晴天*_*4 小时前
SpringBoot 中单独一个类中运行main方法报错:找不到或无法加载主类
java·开发语言·intellij idea
lqjun08275 小时前
Qt程序单独运行报错问题
开发语言·qt
酷飞飞6 小时前
Python网络与多任务编程:TCP/UDP实战指南
网络·python·tcp/ip
hdsoft_huge7 小时前
Java & Spring Boot常见异常全解析:原因、危害、处理与防范
java·开发语言·spring boot
风中的微尘8 小时前
39.网络流入门
开发语言·网络·c++·算法
数字化顾问8 小时前
Python:OpenCV 教程——从传统视觉到深度学习:YOLOv8 与 OpenCV DNN 模块协同实现工业缺陷检测
python
未来之窗软件服务8 小时前
幽冥大陆(二)RDIFSDK 接口文档:布草洗涤厂高效运营的技术桥梁C#—东方仙盟
开发语言·c#·rdif·仙盟创梦ide·东方仙盟
小冯记录编程8 小时前
C++指针陷阱:高效背后的致命危险
开发语言·c++·visual studio