📜  加入 jinja (1)

📅  最后修改于: 2023-12-03 15:22:46.056000             🧑  作者: Mango

加入 Jinja

Jinja 是一个现代、功能强大的 Python 模板引擎。它使用简单但强大的语法,支持从简单变量到复杂表达式,同时还支持继承和布局。

主要特点
  • 高性能:使用 Jinja 编写的模板具有很高的执行效率,花费时间更少。
  • 安全:Jinja 子项会自动转义,从而防止 XSS 攻击。
  • 可扩展:Jinja 能够使用插件开发扩展,从而可以方便地添加自定义功能。
  • 适用范围广:支持从 HTML 到纯文本等多种格式的模板创建。
安装

Jinja 可以使用 pip 工具直接安装:

pip install Jinja2
使用

首先导入 Jinja 模块:

from jinja2 import Environment, PackageLoader

使用模板时需要一个模板环境和一个模板。模板环境负责加载模板并编译它们,而模板仅仅是表示您的视图中展示的内容。Jinja 提供了多个加载器(Loader),可以轻松查找模板并加载它们。PackageLoader 是一种常用的加载器,它从 Python 包中加载模板。

下面来看一个使用 Jinja 的例子:

# 创建模板加载器
env = Environment(loader=PackageLoader('myapp', 'templates'))
# 加载模板
template = env.get_template('index.html')
# 渲染模板
output = template.render(param1=value1, param2=value2)

其中,PackageLoader 的参数 "myapp" 表示应用程序的名称,"templates" 表示模板放置的目录。get_template() 方法返回指定名称的模板,而 render() 方法会将模板渲染成输出。

渲染简单变量

以下是一个简单的例子,演示了如何使用 Jinja 渲染变量:

from jinja2 import Environment, PackageLoader

env = Environment(loader=PackageLoader('myapp', 'templates'))
template = env.get_template('mytemplate.html')

# 渲染变量
output = template.render(name='World')

print(output)  # 输出: Hello World

其中,模板文件 mytemplate.html 的内容如下:

<!DOCTYPE html>
<html>
  <head>
    <title>Hello</title>
  </head>
  <body>
    <h1>Hello {{ name }}</h1>
  </body>
</html>
渲染列表

Jinja2 可以非常方便地渲染列表。以下是一个例子:

from jinja2 import Environment, PackageLoader

env = Environment(loader=PackageLoader('myapp', 'templates'))
template = env.get_template('mytemplate.html')

fruits = ['apple', 'banana', 'orange']

# 将列表作为参数传递给模板
output = template.render(fruits=fruits)

print(output)

模板文件 mytemplate.html 代码如下:

<!DOCTYPE html>
<html>
  <head>
    <title>Fruits</title>
  </head>
  <body>
    <ul>
      {% for fruit in fruits %}
        <li>{{ fruit }}</li>
      {% endfor %}
    </ul>
  </body>
</html>
使用逻辑控制结构

Jinja2 提供了一些逻辑控制结构,例如 ifelifelse 等等,可以方便地在模板中进行逻辑判断。

from jinja2 import Environment, PackageLoader

env = Environment(loader=PackageLoader('myapp', 'templates'))
template = env.get_template('mytemplate.html')

# 将变量作为参数传递给模板
output = template.render(num=6)

print(output)

模板文件 mytemplate.html 代码如下:

<!DOCTYPE html>
<html>
  <head>
    <title>Even or odd</title>
  </head>
  <body>
    {% if num % 2 == 0 %}
      <p>{{ num }} is even.</p>
    {% elif num == 1 %}
      <p>{{ num }} is not even or odd.</p>
    {% else %}
      <p>{{ num }} is odd.</p>
    {% endif %}
  </body>
</html>
继承与布局

在 Jinja2 中,可以使用继承来通过包含多个模板来创建复杂的布局。这是通过定义一个基础模板,并在子模板中覆盖某些块来实现的。以下是一个例子:

<!-- base.html -->
<!DOCTYPE html>
<html>
  <head>
    <title>{% block title %}{% endblock %}</title>
  </head>
  <body>
    {% block content %}{% endblock %}
  </body>
</html>
<!-- child.html -->
{% extends "base.html" %}

{% block title %}Child{% endblock %}

{% block content %}
  <h1>Hello, world!</h1>
{% endblock %}

在这个例子中,child.html 扩展了 base.html,并覆盖了 titlecontent 块。在 base.html 文件中,titlecontent 块都被定义但不包含任何内容,而在 child.html 文件中,我们每个块都有自己的定义。

Jinja2 将 child.html 中的代码插入 base.html 适当的地方,从而创建完整的页面。

结论

Jinja 对 Python 程序员来说是一个很好的工具,可以帮助您轻松地创建动态模板。Jinja 的语法要比其他模板引擎容易理解和使用,并且支持很多丰富的功能。无论您是正在开发小型网站还是大型应用程序,Jinja 无疑都是一个具有强大功能和性能的选择。