网站首页 > java教程 正文
Jinja是一种快速、表达丰富、可扩展的模板引擎。模板中的特殊占位符允许编写类似于Python语法的代码。然后将数据传递给模板,以渲染最终文档。
它包括:
- 模板继承和包含。
- 在模板中定义和导入宏。
- HTML模板可以使用自动转义以防止来自不受信任用户输入的XSS攻击。
- 一个沙盒环境可以安全地渲染不受信任的模板。
- 支持AsyncIO以生成模板并调用异步函数。
- 使用Babel进行国际化支持。
- 模板会即时编译为优化的Python代码并进行缓存,也可以提前编译。
- 异常指向模板中的正确行,以便更轻松地进行调试。
- 可扩展的过滤器、测试、函数,甚至是语法。
Jinja的理念是,虽然应用逻辑尽可能放在Python中,但不应通过过多限制功能来使模板设计师的工作变得困难。
Jiaja用处广泛
Jinja的应用范围非常广泛。它主要用于以下方面:
- Web开发:Jinja最常用于Web开发中的模板渲染,特别是与框架如Flask、Django等结合使用。开发人员可以使用Jinja创建动态网页,从而以更灵活的方式呈现数据。
- 邮件生成:Jinja可以用于生成电子邮件内容。通过将邮件模板与数据结合,可以轻松地生成个性化的电子邮件内容。
- 配置文件生成:Jinja也可以用于生成配置文件。开发人员可以使用Jinja模板来动态地生成各种配置文件,以适应不同的环境和需求。
- 文档生成:Jinja可以用于生成各种文档格式,如Markdown、PDF等。通过结合模板和数据,可以自动化地生成文档内容。
- 报告生成:Jinja还可以用于生成各种报告,如业务报告、数据分析报告等。通过模板化的方法,可以更方便地生成和定制报告内容。
由于Jinja的灵活性和易用性,它在许多领域都有广泛的应用,成为Python开发人员的重要工具之一。
比如:我们在SmartNotebook将Jinja2应用SQL:SQL语句嵌套Jinja2表达式,与python 变量交互来实现动态SQL/SQL 模板;在SmartNotebook里面:SQL单元格支持Jinja2表达式模板,用户可以在SQL代码中引用Python变量,并且使用流程控制(if...else.../for循环等等),极大程度上扩展了SQL语言的灵活性。
Jinja2的基础知识
Jinja模板是一个简单的文本文件/文本串。Jinja可以生成任何基于文本的格式。Jinja模板不需要具有特定的扩展名,比如 .html、.xml,或者其他任何扩展名都可以。模板包含变量和/或表达式,当模板被渲染时,这些变量和表达式将被值替换;同时包含标签,用于控制模板的逻辑。
有几种不同的分隔符。默认的Jinja分隔符配置如下:
- {% ... %} 用于语句(Statements)
- {{ ... }} 用于表达式,用于向模板输出打印内容(Expressions)
- {# ... #} 用于注释,不会包含在模板输出中
在Jinja中有两个关键对象,称为环境(Environment)和模板(Template)。环境对象用于初始化、存储和配置模板渲染所需的变量。模板对象表示一个模板文件,可以用于生成一个或多个输出。
接下来所有示例均在SmartNotebook 中阐述模板语法,环境(Environment)是当前notebook 对应kernel 上下文环境,kernel 中变量和对象,可以在代码单元格中生成和加载变量;模板可以使用Markdown 单元格或SQL 单元格来示例。接下来一个简单示例如下:
a=range(10)
{% for item in a %}
item:{{ item }} ,{{ item**2}}
{% endfor %}
For循环
循环遍历序列中的每个项。可以循环迭代列表、字典、集合,列表或生成器可以参考上面的例子,dict 字典迭代For循环如下:
my_dict ={"name":"smartnotebook","address":"shanghai"}
<dl>
{% for key, value in my_dict.items() %}
{{ key|e }} :{{ value|e }}
{% endfor %}
</dl>
Python 字典可能不按您希望的顺序显示。如果顺序很重要,请使用 |dictsort 过滤器。
{% for key, value in my_dict | dictsort %}
{{ key|e }} : {{ value|e }}
{% endfor %}
在 for 循环块内部,您可以访问一些特殊变量:
变量 | 描述 |
loop.index | 当前循环的迭代次数。(从 1 开始索引) |
loop.index0 | 当前循环的迭代次数。(从 0 开始索引) |
loop.revindex | 距离循环末尾的迭代次数。(从 1 开始索引) |
loop.revindex0 | 距离循环末尾的迭代次数。(从 0 开始索引) |
loop.first | 如果是第一次迭代,则为 True。 |
loop.last | 如果是最后一次迭代,则为 True。 |
loop.length | 序列中的项数。 |
loop.cycle | 在列表序列之间循环的辅助函数。请参阅下面的说明。 |
loop.depth | 指示渲染当前递归循环的深度。从第 1 级开始。 |
loop.depth0 | 指示渲染当前递归循环的深度。从第 0 级开始。 |
loop.previtem | 上一次循环迭代中的项。在第一次迭代期间未定义。 |
loop.nextitem | 下一次循环迭代中的项。在最后一次迭代期间未定义。 |
loop.changed(*val) | 如果之前调用时的值不同(或根本未调用),则为 True。 |
{% for key, value in my_dict | dictsort %}
{{ key|e }} : {{ value|e }} ;{{ loop.cycle('odd', 'even') }};{{loop.index}}
{% endfor %}
If 判断
Jinja2 中的 if 语句与 Python 中的 if 语句类似。在最简单的形式下,您可以使用它来测试变量是否已定义、非空且非假:
a = 1
{% if a > 0 %}
a = 1
{% endif %}
对于多个分支,elif 和 else 可以像在 Python 中一样使用。您也可以在那里使用更复杂的表达式:
{% if a < 0 %}
a
{% else%}
aaaa
{% endif %}
Filters (过滤器)
过滤器部分允许您在模板数据块上应用常规的Jinja2过滤器。只需将代码放在特殊的过滤器部分中即可:
{% filter upper %}
This text becomes uppercase
{% endfilter %}
其他指令参考:https://jinja.palletsprojects.com/en/3.1.x/templates/
Jinja2是一款快速、表达丰富、可扩展的模板引擎,广泛应用于Web开发、邮件生成、配置文件生成、文档生成和报告生成等领域。其特点包括模板继承、HTML自动转义、安全沙盒环境等。Jinja2支持丰富的语法和功能,提供了丰富的特殊变量和过滤器,可以灵活处理模板渲染逻辑。它的理念是保持Python代码简洁、灵活,同时提供强大的模板设计功能。
猜你喜欢
- 2025-01-23 Ejs模板引擎注入实现RCE(ejs loader)
- 2025-01-23 微软PowerPoint新技能:轻松制作酷炫模板/动画
- 2025-01-23 18个开源的Java CMS(开源cms排名)
- 2025-01-23 Java全栈式Web应用开发框架——LEAP的核心设计思想
- 2025-01-23 推荐一款GitHub10k+点赞Spring Boot快速开发企业级Admin管理后台
- 2025-01-23 字节面试官:“这92道 Spring Boot 面试题都答不上来?”
- 2025-01-23 聊聊我们那些年用过的表达式引擎组件
- 2025-01-23 提升效率!一款小而巧的定制化代码生成工具
- 2025-01-23 学习规则引擎——国产开源规则引擎URULE
- 2025-01-23 jinjia2:一个超级模版Python库(python jinja2模板)
你 发表评论:
欢迎- 最近发表
-
- Java常量定义防暴指南:从"杀马特"到"高富帅"的华丽转身
- Java接口设计原则与实践:优雅编程的艺术
- java 包管理、访问修饰符、static/final关键字
- Java工程师的代码规范与最佳实践:优雅代码的艺术
- 编写一个java程序(编写一个Java程序计算并输出1到n的阶乘)
- Mycat的搭建以及配置与启动(mycat部署)
- Weblogic 安装 -“不是有效的 JDK Java 主目录”解决办法
- SpringBoot打包部署解析:jar包的生成和结构
- 《Servlet》第05节:创建第一个Servlet程序(HelloSevlet)
- 你认为最简单的单例模式,东西还挺多
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)