Jinja2 基础知识的快速入门
作为 Flask 初学者,学习 Jinja2 模板引擎的基本概念非常重要,因为它是 Flask 渲染页面时处理动态内容的核心部分。下面是一些简单的 Jinja2 基础知识的快速入门。
1. 变量替换
在 Jinja2 模板中,可以通过 {{ }}
来插入 Python 中传递给模板的变量。例如,后端传递一个变量 name
到模板:
后端代码(Flask):
python复制from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def index():
name = "John"
return render_template('index.html', name=name)
if __name__ == '__main__':
app.run(debug=True)
index.html
模板:
html复制<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Jinja2 Example</title>
</head>
<body>
<h1>Hello, {{ name }}!</h1> <!-- 显示 "Hello, John!" -->
</body>
</html>
2. 控制结构:条件判断(if)
Jinja2 支持条件判断,可以根据不同的情况显示不同的内容。使用 {% if %}
和 {% else %}
来进行条件判断。
示例:
python复制@app.route('/greet/<name>')
def greet(name):
return render_template('greet.html', name=name)
greet.html
模板:
html复制<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Greeting Page</title>
</head>
<body>
{% if name == "John" %}
<h1>Welcome, John!</h1>
{% else %}
<h1>Welcome, {{ name }}!</h1>
{% endif %}
</body>
</html>
在这个例子中,如果 URL 中传入的是 John
,则显示 "Welcome, John!",否则显示 "Welcome, {name}"。
3. 循环(for)
Jinja2 也支持循环,你可以使用 {% for %}
来循环列表或字典等数据。
示例:
python复制@app.route('/items')
def items():
items_list = ['apple', 'banana', 'cherry']
return render_template('items.html', items=items_list)
items.html
模板:
html复制<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Items List</title>
</head>
<body>
<ul>
{% for item in items %}
<li>{{ item }}</li>
{% endfor %}
</ul>
</body>
</html>
这段代码将生成一个无序列表,列出 items_list
中的每一项。
4. 过滤器
Jinja2 允许你使用过滤器来修改变量的输出。比如,使用 upper
过滤器将字符串转换为大写,或者使用 date
格式化日期。
示例:
python复制@app.route('/welcome')
def welcome():
user = 'john doe'
return render_template('welcome.html', user=user)
welcome.html
模板:
html复制<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Welcome Page</title>
</head>
<body>
<h1>Welcome, {{ user | upper }}!</h1> <!-- 输出 "Welcome, JOHN DOE!" -->
</body>
</html>
你可以使用 |
来应用过滤器,upper
将 user
转换为大写字母。
5. 模板继承
模板继承是 Jinja2 的一个强大功能,它允许你创建一个基本的模板,然后其他模板可以继承并扩展它。通过 {% block %}
和 {% extends %}
实现。
base.html
(基础模板):
html复制<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{% block title %}My Website{% endblock %}</title>
</head>
<body>
<header>
<h1>Welcome to my website!</h1>
</header>
<div>
{% block content %}
{% endblock %}
</div>
</body>
</html>
index.html
(继承模板):
html复制{% extends 'base.html' %}
{% block title %}Home Page{% endblock %}
{% block content %}
<h2>Welcome to the homepage!</h2>
{% endblock %}
在这个例子中,index.html
继承了 base.html
,并通过 {% block %}
填充或重写了 title
和 content
部分。
6. 包含子模板(include)
如果你有多个模板文件,Jinja2 允许你通过 {% include %}
在一个模板中嵌入另一个模板。
示例:
html复制<!-- header.html -->
<header>
<h1>Welcome to my website!</h1>
</header>
html复制<!-- index.html -->
{% include 'header.html' %}
<p>This is the homepage content.</p>