在 Flask 框架中,模板(Templating)是通过 Jinja2 模板引擎来实现的,它允许开发者将动态数据嵌入到静态的 HTML 文件中。Jinja2 提供了一套简洁而强大的语法,使得在模板中处理变量、控制结构、继承、宏等变得非常容易。
以下是一些 Flask 中 Jinja2 模板语法的关键点:
变量
使用双大括号 {{ }}
来输出变量。
html复制代码
<p>Hello, {{ username }}!</p> |
控制结构
For 循环
使用 {% for ... in ... %}
来遍历列表或字典。
html复制代码
<ul> | |
{% for item in item_list %} | |
<li>{{ item }}</li> | |
{% endfor %} | |
</ul> |
If 条件
使用 {% if ... %}
、{% elif ... %}
和 {% else %}
来实现条件判断。
html复制代码
{% if user_is_logged_in %} | |
<p>Welcome back, {{ user_name }}!</p> | |
{% else %} | |
<p>Please <a href="{{ login_url }}">log in</a>.</p> | |
{% endif %} |
过滤器
过滤器用于修改变量的输出。Jinja2 提供了许多内置过滤器,如 capitalize
、upper
、lower
、title
等。
html复制代码
<p>The name is {{ name|capitalize }}.</p> |
你也可以创建自定义过滤器。
宏
宏允许你在模板中定义可重用的代码片段。
html复制代码
{% macro input(name, value='', type='text') %} | |
<input type="{{ type }}" name="{{ name }}" value="{{ value }}"> | |
{% endmacro %} | |
<form> | |
{{ input('username') }} | |
{{ input('password', type='password') }} | |
<input type="submit" value="Submit"> | |
</form> |
模板继承
模板继承允许你定义一个基础模板,并在其他模板中扩展或覆盖它。
基础模板 base.html
html复制代码
<!DOCTYPE html> | |
<html lang="en"> | |
<head> | |
<meta charset="UTF-8"> | |
<title>{{ title }}</title> | |
<block name="head"> | |
<!-- 这里可以被子模板覆盖 --> | |
</block> | |
</head> | |
<body> | |
<header> | |
<h1>My Website</h1> | |
</header> | |
<main> | |
{% block content %}{% endblock %} | |
</main> | |
<footer> | |
<p>© {{ current_year }} My Website</p> | |
</footer> | |
</body> | |
</html> |
子模板 index.html
html复制代码
{% extends "base.html" %} | |
{% block title %}Home Page{% endblock %} | |
{% block head %} | |
{{ super() }} <!-- 调用父模板的 head 块 --> | |
<link rel="stylesheet" href="/static/styles.css"> | |
{% endblock %} | |
{% block content %} | |
<h2>Welcome to the Home Page</h2> | |
<p>This is the main content of the home page.</p> | |
{% endblock %} | |
{% set current_year = 2023 %} <!-- 在子模板中设置变量 --> |
模板全局函数和过滤器
你可以在 Flask 应用中注册全局函数和过滤器,使它们在模板中可用。
python复制代码
from flask import Flask, render_template_string | |
app = Flask(__name__) | |
@app.template_global() | |
def global_function(x): | |
return x * 2 | |
@app.template_filter('reverse') | |
def reverse_filter(s): | |
return s[::-1] | |
@app.route('/') | |
def index(): | |
return render_template_string(''' | |
<p>Global function result: {{ global_function(5) }}</p> | |
<p>Reversed string: {{ "hello"|reverse }}</p> | |
''') | |
if __name__ == '__main__': | |
app.run(debug=True) |
注意事项
- 模板文件通常放在 Flask 应用的
templates
文件夹中。 - 模板语法区分大小写。
- 在模板中,你可以使用
{{ url_for('route_name') }}
来生成 URL。 - 模板继承中的
{% block ... %}{% endblock %}
用于定义可被子模板覆盖的块。 - 使用
{{ super() }}
在子模板中调用父模板的块内容。
Jinja2 模板引擎的强大之处在于它的灵活性和可扩展性,它使得在 Flask 应用中处理复杂的模板变得轻松而高效。