📅  最后修改于: 2023-12-03 15:22:46.056000             🧑  作者: Mango
Jinja 是一个现代、功能强大的 Python 模板引擎。它使用简单但强大的语法,支持从简单变量到复杂表达式,同时还支持继承和布局。
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 提供了一些逻辑控制结构,例如 if
、elif
和 else
等等,可以方便地在模板中进行逻辑判断。
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
,并覆盖了 title
和 content
块。在 base.html
文件中,title
和 content
块都被定义但不包含任何内容,而在 child.html
文件中,我们每个块都有自己的定义。
Jinja2 将 child.html
中的代码插入 base.html
适当的地方,从而创建完整的页面。
Jinja 对 Python 程序员来说是一个很好的工具,可以帮助您轻松地创建动态模板。Jinja 的语法要比其他模板引擎容易理解和使用,并且支持很多丰富的功能。无论您是正在开发小型网站还是大型应用程序,Jinja 无疑都是一个具有强大功能和性能的选择。