专业的JAVA编程教程与资源

网站首页 > java教程 正文

一文带您了解Jinja2:探索Python模板引擎

temp10 2025-01-23 21:42:22 java教程 93 ℃ 0 评论

Jinja是一种快速、表达丰富、可扩展的模板引擎。模板中的特殊占位符允许编写类似于Python语法的代码。然后将数据传递给模板,以渲染最终文档。

它包括:

一文带您了解Jinja2:探索Python模板引擎

  • 模板继承和包含。
  • 在模板中定义和导入宏。
  • HTML模板可以使用自动转义以防止来自不受信任用户输入的XSS攻击。
  • 一个沙盒环境可以安全地渲染不受信任的模板。
  • 支持AsyncIO以生成模板并调用异步函数。
  • 使用Babel进行国际化支持。
  • 模板会即时编译为优化的Python代码并进行缓存,也可以提前编译。
  • 异常指向模板中的正确行,以便更轻松地进行调试。
  • 可扩展的过滤器、测试、函数,甚至是语法。

Jinja的理念是,虽然应用逻辑尽可能放在Python中,但不应通过过多限制功能来使模板设计师的工作变得困难。

Jiaja用处广泛

Jinja的应用范围非常广泛。它主要用于以下方面:

  1. Web开发:Jinja最常用于Web开发中的模板渲染,特别是与框架如Flask、Django等结合使用。开发人员可以使用Jinja创建动态网页,从而以更灵活的方式呈现数据。
  2. 邮件生成:Jinja可以用于生成电子邮件内容。通过将邮件模板与数据结合,可以轻松地生成个性化的电子邮件内容。
  3. 配置文件生成:Jinja也可以用于生成配置文件。开发人员可以使用Jinja模板来动态地生成各种配置文件,以适应不同的环境和需求。
  4. 文档生成:Jinja可以用于生成各种文档格式,如Markdown、PDF等。通过结合模板和数据,可以自动化地生成文档内容。
  5. 报告生成: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代码简洁、灵活,同时提供强大的模板设计功能。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表