Python 中使用 HTML 模板的完整指南
在 Python Web 开发中,将业务逻辑与页面展示分离是构建可维护应用的关键。HTML 模板引擎允许开发者在 HTML 文件中嵌入 Python 代码逻辑,从而动态生成网页内容。本文将详细介绍 Python 中最常用的两个模板引擎:Jinja2 和 Mako,涵盖安装、基础语法、高级特性及安全实践。
一、为什么使用模板引擎
直接拼接字符串生成 HTML 不仅效率低下,而且难以维护。模板引擎提供了以下优势:
本文详细讲解了 Python 中 HTML 模板的使用,重点介绍了 Jinja2 和 Mako 两大主流模板引擎。内容包括环境安装、模板加载与渲染流程、核心语法特性(如变量插值、控制结构、过滤器、宏、模板继承)、Web 框架(Flask/FastAPI)集成示例以及安全最佳实践。通过对比两种引擎的特点,帮助开发者根据实际需求选择合适的方案,实现业务逻辑与页面展示的分离,提升代码可维护性与安全性。

在 Python Web 开发中,将业务逻辑与页面展示分离是构建可维护应用的关键。HTML 模板引擎允许开发者在 HTML 文件中嵌入 Python 代码逻辑,从而动态生成网页内容。本文将详细介绍 Python 中最常用的两个模板引擎:Jinja2 和 Mako,涵盖安装、基础语法、高级特性及安全实践。
直接拼接字符串生成 HTML 不仅效率低下,而且难以维护。模板引擎提供了以下优势:
Jinja2 是 Python 生态中最流行的模板引擎之一,也是 Flask 框架的默认模板引擎。它语法灵活,功能强大。
pip install jinja2
使用 Environment 类来管理模板环境,FileSystemLoader 用于指定模板文件路径。
from jinja2 import Environment, FileSystemLoader
# 初始化环境,指定模板目录
env = Environment(loader=FileSystemLoader('templates'))
# 获取模板对象
template = env.get_template('index.html')
通过 render 方法传入上下文数据字典,模板中的变量将被替换。
output = template.render(
title='欢迎页面',
content='欢迎来到我的网站',
items=['Item 1', 'Item 2', 'Item 3']
)
print(output)
Jinja2 支持标准的编程结构,如条件判断和循环。
模板示例 (index.html):
<!DOCTYPE html>
<html>
<head><title>{{ title }}</title></head>
<body>
<h1>{{ content }}</h1>
{% if items %}
<ul>
{% for item in items %}
<li>{{ item }}</li>
{% endfor %}
</ul>
{% else %}
<p>暂无数据</p>
{% endif %}
</body>
</html>
Jinja2 内置了丰富的过滤器,如 upper, lower, length 等。
{{ name|upper }}
{{ list|join(', ') }}
宏(Macro)类似于函数,可在模板中定义并复用。
{% macro render_item(item) %}
<li>{{ item }}</li>
{% endmacro %}
<ul>
{{ render_item('Apple') }}
{{ render_item('Banana') }}
</ul>
利用 {% extends %} 和 {% block %} 实现布局复用。
base.html:
<!DOCTYPE html>
<html>
<body>
<header>{% block header %}{% endblock %}</header>
<main>{% block content %}{% endblock %}</main>
</body>
</html>
child.html:
{% extends "base.html" %}
{% block content %}
<p>这是子页面的内容。</p>
{% endblock %}
Mako 设计目标是高性能和简单性,适合对性能要求较高的场景。
pip install mako
Mako 的 API 相对更简洁。
from mako.template import Template
from mako.lookup import TemplateLookup
# 创建查找器,指定模板目录
lookup = TemplateLookup(directories=['templates'])
# 加载模板
tmpl = Template(filename='index.html', lookup=lookup)
# 渲染
output = tmpl.render(title='Hello', data=[1, 2, 3])
print(output)
Mako 使用 ${} 进行表达式插值,%% 表示 Python 语句。
模板示例:
<h1>${ title }</h1>
<%
for item in data:
%>
<div>${ item }</div>
<% endfor %>
Mako 同样支持继承,但语法略有不同。
<%inherit file="base.html" />
<%def name="content()">
<p>Mako 继承示例</p>
</%def>
在实际项目中,通常结合 Web 框架使用。
Flask 内置了对 Jinja2 的支持,无需额外配置即可使用。
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def index():
return render_template('index.html', title='Home')
FastAPI 推荐使用 Jinja2 配合 Jinja2Templates。
from fastapi import FastAPI
from fastapi.templating import Jinja2Templates
app = FastAPI()
templates = Jinja2Templates(directory="templates")
@app.get("/")
def read_root(request):
return templates.TemplateResponse("index.html", {"request": request})
Jinja2 和 Mako 都是优秀的 Python 模板引擎。Jinja2 功能丰富,社区活跃,适合大多数 Web 项目;Mako 性能优异,语法更接近原生 Python,适合特定高性能需求场景。选择时应根据项目规模、团队熟悉度及性能要求进行权衡。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online