 技术
总共20项
Jinja2简介人生如逆旅,我亦是行人。
最后更新于2025-03-12 17:54:26

1. 简介

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

特点:

2. 安装

建议使用最新版本的 Python。Jinja 支持 Python 3.7 及更新版本。建议使用虚拟环境,以便将项目依赖关系与其他项目和系统隔离。

使用 pip 安装最新版本的 Jinja:

$ pip install Jinja2

2.1 依赖项

安装 Jinja 时会自动安装这些依赖项。

MarkupSafe 会在渲染模板时转义不信任的输入,以避免注入攻击。

2.2 可选依赖项

安装 Jinja 时不会自动安装。

Babel 在模板中提供翻译支持。

2.3 基本API使用

最基本的方式就是通过 Template 创建一个模板并渲染它。

>>> from jinja2 import Template
>>> template = Template('Hello {{ name }}!')
>>> template.render(name='test poo')
'Hello test poo!'

3 API

3.1 基础知识

Jinja 使用一个名为 "模板环境 "的中心对象。该类的实例用于存储配置和全局对象,并用于从文件系统或其他位置加载模板。即使您使用模板类的构造函数从字符串创建模板,也会自动创建一个环境。

配置 Jinja 为应用程序加载模板的最简单方法是使用 PackageLoader

from jinja2 import Environment, PackageLoader, select_autoescape
env = Environment(
    loader=PackageLoader("yourapp")
    autoescape=select_autoescape()
)

这将创建一个带有加载器的模板环境,加载器会在 yourapp Python 软件包内的模板文件夹中查找模板。它还会启用 HTML 文件的自动换码功能。该加载器只要求 yourapp 是可导入的,它会为你找出文件夹的绝对路径。

不同的加载器可用于以其他方式或从其他位置加载模板。它们都列在下面的加载器部分。如果你想从更适合你的项目的来源加载模板,也可以自己编写。

要从该环境加载模板,请使用 get_template() 方法,它会返回已加载的模板。

template = env.get_template("mytemplate.html") 

调用 render() 方法用一些变量渲染模板。

print(template.render(the="variables", go="here"))

使用模板加载器而不是向 Template 或 Environment.from_string() 传递字符串有很多好处。除了更容易使用外,它还能实现模板继承。

3.2 高级API

高级应用程序接口(High Level API)是您将在应用程序中使用的应用程序接口,用于加载和呈现 Jinja 模板。而低级应用程序接口(Low Level API)只有在你想深入研究 Jinja或开发扩展时才有用。

详见:https://jinja.palletsprojects.com/en/3.1.x/api/#high-level-api

4 模板

简介

Jinja 模板是一个简单的文本文件。Jinja 可以生成任何基于文本的格式(HTML、XML、CSV、LaTeX 等)。Jinja 模板不需要特定的扩展名:.html、.xml 或任何其他扩展名都可以。

一个模板包含变量和/或表达式,当模板被渲染时,这些变量和/或表达式将被替换为值;还包含标签,用于控制模板的逻辑。

下面是一个模板示例:

<!DOCTYPE html>
<html lang="en">
<head>
    <title>My Webpage</title>
</head>
<body>
    <ul id="navigation">
    {% for item in navigation %}
        <li><a href="{{ item.href }}">{{ item.caption }}</a></li>
    {% endfor %}
    </ul>

    <h1>My Webpage</h1>
    {{ a_variable }}

    {# a comment #}
</body>
</html>

上面的示例显示了默认配置设置。应用程序开发人员可以将语法配置从 {% foo %} 更改为 <% foo %> 或类似内容。

有几种分隔符。Jinja 的默认分隔符配置如下:

行语句和注释也可以使用,但它们没有默认的前缀字符。要使用它们,请在创建环境时设置 line_statement_prefixline_comment_prefix

详见:https://jinja.palletsprojects.com/en/3.1.x/templates/

5 集成

5.1 Flask

Flask 框架默认使用 Jinja 模板。Flask 会设置一个 Jinja 环境和模板加载器,并提供从视图函数轻松呈现模板的功能。

5.2 Django

Django 支持使用 Jinja 作为模板引擎,请参见 https://docs.djangoproject.com/en/stable/topics/templates/#support-for-template-engines。

可集成的还有 BabelPylons

6 实例

在这个模板中,{{ title }}{{ heading }} 和 {{ name }} 是变量,将在渲染时被替换。

from jinja2 import Template

# 模板字符串
template_string = """
<!DOCTYPE html>
<html>
<head>
    <title>{{ title }}</title>
</head>
<body>
    <h1>{{ heading }}</h1>
    <p>嗨, {{ name }}!</p>
</body>
</html>
"""

# 创建模板对象
template = Template(template_string)

# 渲染模板
print(template.render(title="测试一下", heading="欢迎一下", name="初学者")) 

运行结果:

<!DOCTYPE html>
<html>
<head>
    <title>测试一下</title>
</head>
<body>
    <h1>欢迎一下</h1>
    <p>嗨, 初学者!</p>
</body>
</html>

Jinja2支持常见的控制结构,例如条件判断和循环。下面是一个使用循环的例子:

<ul>
{% for item in item_list %}
    <li>{{ item }}</li>
{% endfor %}
</ul>

在Python代码中,提供一个列表来渲染这个模板:

print(template.render(item_list=["苹果", "香蕉", "橘子"]))

模板继承是Jinja2的一个强大功能。你可以创建一个基础模板,然后在其他模板中继承和扩展它。例如:

基础模板(base.html):

<!DOCTYPE html>
<html>
<head>
    <title>{% block title %}{% endblock %}</title>
</head>
<body>
    {% block body %}
    {% endblock %}
</body>
</html>

子模板(child.html):

{% extends "base.html" %}

{% block title %}子页面标题{% endblock %}

{% block body %}
    <p>这是子页面的内容。</p>
{% endblock %}

Jinja2还提供了多种过滤器,用于转换变量。例如,使用 capitalize 过滤器将字符串的首字母大写:

<p>{{ "hello world" | capitalize }}</p>

过滤器是可以自己定义的,详见:https://jinja.palletsprojects.com/en/3.1.x/api/#custom-filters

安装 flask

pip install flask

项目结构

flaskr/
│
├── templates/
│   └── index.html
│
└── flaskr.py

创建Jinja2模板

在 templates 目录下创建一个 index.html 文件,作为我们的 Jinja2 模板。这个模板将简单地展示一个传入的变量。

<!DOCTYPE html>
<html>
<head>
    <title>Flask with Jinja2</title>
</head>
<body>
    <h1>Welcome to Flask with Jinja2</h1>
    <p>Hello, {{ name }}!</p>
</body>
</html>

Flask集成Jinja2

在 flaskr.py 文件中,我们将创建一个FastAPI应用,并配置Jinja2环境。然后,我们将创建一个路由来渲染上面的模板。

from flask import Flask, render_template

# 创建我们的小程序 :)
app = Flask(__name__)

# 登陆页面
@app.route('/', methods=['GET', 'POST'])
def test():
    return render_template('index.html',name="test poo!")

if __name__ == '__main__':
    app.run()

运行应用

python flaskr.py

打开浏览器,访问 http://localhost:5000,你将看到由 Jinja2 模板渲染的页面,其中包含了从 Flask 路由传递的变量。