这个案例展示了如何使用 Jinja2 渲染一个简单的 HTML 页面,其中包含变量插值、条件语句、循环、过滤器和模板继承
目录结构
project/
│
├── templates/
│ ├── base.html
│ ├── index.html
│ └── item.html
│
└── app.py
1. base.html
(基础模板)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{% block title %}Default Title{% endblock %}</title>
</head>
<body>
<header>
<h1>{% block header %}Welcome to My Website{% endblock %}</h1>
</header>
<main>
{% block content %}{% endblock %}
</main>
<footer>
<p>{% block footer %}Footer content here{% endblock %}</p>
</footer>
</body>
</html>
2. index.html
(子模板)
{% extends "base.html" %}
{% block title %}Home Page{% endblock %}
{% block header %}
<h1>Home Page</h1>
{% endblock %}
{% block content %}
<p>Hello, {{ user.name | default('Guest') }}!</p>
<p>Here are your items:</p>
<ul>
{% for item in items %}
{% include "item.html" %}
{% endfor %}
</ul>
{% endblock %}
3. item.html
(包含模板)
<li>{{ item.name | upper }} - ${{ item.price | round(2) }}</li>
4. app.py
(Python 代码)
from jinja2 import Environment, FileSystemLoader
# 创建 Jinja2 环境,加载模板文件
env = Environment(loader=FileSystemLoader('templates'))
# 定义模板上下文
context = {
'user': {
'name': 'John Doe'
},
'items': [
{'name': 'apple', 'price': 0.5},
{'name': 'banana', 'price': 0.75},
{'name': 'cherry', 'price': 0.2}
]
}
# 加载模板
template = env.get_template('index.html')
# 渲染模板
rendered = template.render(context)
# 输出渲染结果
print(rendered)
运行 app.py
运行 app.py
,将看到以下输出:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Home Page</title>
</head>
<body>
<header>
<h1>Home Page</h1>
</header>
<main>
<p>Hello, John Doe!</p>
<p>Here are your items:</p>
<ul>
<li>APPLE - $0.50</li>
<li>BANANA - $0.75</li>
<li>CHERRY - $0.20</li>
</ul>
</main>
<footer>
<p>Footer content here</p>
</footer>
</body>
</html>
解释
- 基础模板
base.html
:定义了页面的基本结构,包括标题、头部、内容和页脚区域。 - 子模板
index.html
:继承自base.html
,并覆盖了标题、头部和内容区域。使用了变量插值、条件语句和循环。 - 包含模板
item.html
:用于渲染每个项目的列表项,展示了如何使用过滤器。 - Python 代码
app.py
:创建 Jinja2 环境,定义上下文数据,加载并渲染模板,最后输出渲染结果。