Python HTML 的模板引擎 Jinja2

发布时间 2023-08-27 18:03:26作者: 白露~

Python Jinja2 是一个用于生成动态 HTML 的模板引擎。它可以让你在 HTML 中使用 Python 的语法和逻辑,从而实现数据和视图的分离。本文将介绍 Python Jinja2 的基本用法和特性,以及一些实例和技巧。

安装和导入

要使用 Python Jinja2,你需要先安装它。你可以使用 pip 命令来安装:

pip install Jinja2

安装完成后,你可以在你的 Python 代码中导入 jinja2 模块:

from jinja2 import Template, Environment, FileSystemLoader

创建和渲染模板

要使用 Python Jinja2,你需要先创建一个模板文件,通常是以 .html 为扩展名的文件。模板文件中可以包含 HTML 代码,以及一些 Jinja2 的语法元素,如变量、过滤器、控制结构等。下面是一个简单的模板文件的例子:

<html>
<head>
    <title>{{ title }}</title>
</head>
<body>
    <h1>{{ title }}</h1>
    <p>{{ content }}</p>
</body>
</html>

在这个模板文件中,我们使用了两个变量:{{ title }} 和 {{ content }}。这些变量将在渲染模板时被替换为实际的值。要渲染模板,我们需要在 Python 代码中创建一个 Environment 对象,指定模板文件的路径,然后使用 get_template 方法加载模板文件,最后使用 render 方法传入变量的值,得到渲染后的 HTML 字符串。下面是一个渲染模板的例子:

# 创建一个 Environment 对象,指定模板文件的路径
env = Environment(loader=FileSystemLoader('templates'))
# 加载模板文件
template = env.get_template('example.html')
# 渲染模板,传入变量的值
html = template.render(title='Python Jinja2', content='This is a blog about Python Jinja2.')
# 打印渲染后的 HTML 字符串
print(html)

运行这段代码,我们可以得到如下的输出:

<html>
<head>
    <title>Python Jinja2</title>
</head>
<body>
    <h1>Python Jinja2</h1>
    <p>This is a blog about Python Jinja2.</p>
</body>
</html>

可以看到,模板中的变量已经被替换为我们传入的值。

使用过滤器

过滤器是一种可以对变量进行转换或处理的功能。在模板中,我们可以使用 | 符号来应用过滤器。Jinja2 提供了很多内置的过滤器,例如 capitalize、lower、upper、title、trim、escape 等。我们也可以自定义过滤器。下面是一个使用过滤器的例子:

<html>
<head>
    <title>{{ title|title }}</title>
</head>
<body>
    <h1>{{ title|title }}</h1>
    <p>{{ content|trim|escape }}</p>
</body>
</html>

在这个例子中,我们对 title 变量应用了 title 过滤器,它会将每个单词的首字母大写。我们对 content 变量应用了 trim 和 escape 过滤器,它们会分别去除两端的空白字符和转义 HTML 特殊字符。如果我们传入如下的值:

title = 'python jinja2'
content = '  This is a blog about <b>Python Jinja2</b>.  '

那么渲染后的 HTML 字符串为:

<html>
<head>
    <title>Python Jinja2</title>
</head>
<body>
    <h1>Python Jinja2</h1>
    <p>This is a blog about &lt;b&gt;Python Jinja2&lt;/b&gt;.</p>
</body>
</html>

使用控制结构

控制结构是一种可以实现条件判断和循环遍历的功能。在模板中,我们可以使用 {% … %} 符号来表示控制结构的开始和结束。Jinja2 支持的控制结构有 if、elif、else、for、endfor、endif 等。下面是一个使用控制结构的例子:

<html>
<head>
    <title>{{ title }}</title>
</head>
<body>
    <h1>{{ title }}</h1>
    <p>{{ content }}</p>
    {% if comments %}
    <ul>
        {% for comment in comments %}
        <li>{{ comment }}</li>
        {% endfor %}
    </ul>
    {% else %}
    <p>No comments.</p>
    {% endif %}
</body>
</html>

在这个例子中,我们使用了 if 和 for 语句来实现条件判断和循环遍历。如果我们传入如下的值:

title = 'Python Jinja2'
content = 'This is a blog about Python Jinja2.'
comments = ['Great blog!', 'Very informative.', 'I learned a lot.']

那么渲染后的 HTML 字符串为:

<html>
<head>
    <title>Python Jinja2</title>
</head>
<body>
    <h1>Python Jinja2</h1>
    <p>This is a blog about Python Jinja2.</p>
    <ul>
        <li>Great blog!</li>
        <li>Very informative.</li>
        <li>I learned a lot.</li>
    </ul>
</body>
</html>

结语

Python Jinja2 是一个强大而灵活的模板引擎,它可以让你在 HTML 中使用 Python 的语法和逻辑,从而实现数据和视图的分离。本文只是介绍了 Python Jinja2 的基本用法和特性,还有很多高级功能和技巧没有涉及,如继承、宏、测试、过滤器等。如果你想了解更多关于 Python Jinja2 的内容,你可以参考官方文档或其他相关资料。

: [Jinja — Jinja Documentation (3.0.x)] : [Python Jinja2 模板引擎教程 - 简书] : [Builtin Filters — Jinja Documentation (3.0.x)] : [Custom Filters — Jinja Documentation (3.0.x)] : [Control Structures — Jinja Documentation (3.0.x)] : [Template Designer Documentation — Jinja Documentation (3.0.x)] : [Jinja Documentation (3.0.x)] : https://www.jianshu.com/p/9b4a9c5f4f6a : https://jinja.palletsprojects.com/en/3.0.x/templates/#builtin-filters : https://jinja.palletsprojects.com/en/3.0.x/api/#custom-filters : https://jinja.palletsprojects.com/en/3.0.x/templates/#control-structures : https://jinja.palletsprojects.com/en/3.0.x/templates/ : https://jinja.palletsprojects.com/en/3.0.x/