Python 作为“胶水语言”,负责:

- 连接 到数据库。
- 执行 SQL 查询,从数据库中提取数据。
- 处理 数据(格式化、计算)。
- 使用一个模板引擎,将处理后的数据动态嵌入到 HTML 模板中,生成最终的 HTML 页面。
下面我将分步详细解释这个过程,并提供从简单到复杂的完整代码示例。
核心流程
- 数据库准备: 确保你有一个数据库,并且里面有数据。
- Python 连接数据库: 使用合适的 Python 库(如
pymysqlfor MySQL,psycopg2for PostgreSQL,sqlite3for SQLite)连接到你的数据库。 - 数据查询: 编写 SQL 语句并执行,获取数据,数据通常以列表或字典的形式返回。
- HTML 模板创建: 创建一个 HTML 文件,在需要插入数据的地方使用特殊的占位符(
{{ variable_name }})。 - 模板渲染: 使用 Python 模板引擎(如 Jinja2 是最流行和强大的选择)将数据填充到 HTML 模板中,生成最终的、完整的 HTML 字符串。
- 输出结果: 将生成的 HTML 保存到文件,或者通过 Web 框架(如 Flask, Django)直接在浏览器中显示。
第一步:准备工作
假设我们有一个简单的 SQLite 数据库,存储着一些文章信息。
-
安装必要的库 我们主要需要
Jinja2来处理模板,如果你的数据库是 MySQL 或 PostgreSQL,你还需要相应的驱动库。# 安装 Jinja2 模板引擎 pip install Jinja2 # 如果使用 MySQL pip install pymysql # 如果使用 PostgreSQL pip install psycopg2-binary
-
创建一个示例数据库和数据
(图片来源网络,侵删)创建一个名为
mydatabase.db的 SQLite 文件,并插入一些数据,你可以用以下 Python 脚本来快速创建:# setup_database.py import sqlite3 # 连接到数据库 (如果不存在则创建) conn = sqlite3.connect('mydatabase.db') cursor = conn.cursor() # 创建一个 'articles' 表 cursor.execute(''' CREATE TABLE IF NOT EXISTS articles ( id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT NOT NULL, content TEXT NOT NULL, author TEXT NOT NULL, publish_date DATE ) ''') # 插入一些示例数据 articles_data = [ ('Python入门', 'Python是一种解释型、高级和通用的编程语言。', '张三', '2025-01-15'), ('HTML与CSS', 'HTML和CSS是构建网页的基础技术。', '李四', '2025-02-20'), ('数据库简介', '数据库用于存储、管理和检索数据。', '张三', '2025-03-10') ] cursor.executemany("INSERT INTO articles (title, content, author, publish_date) VALUES (?, ?, ?, ?)", articles_data) # 提交更改并关闭连接 conn.commit() conn.close() print("数据库和示例数据已创建。")运行这个脚本后,你的项目目录下会多出一个
mydatabase.db文件。
第二步:创建 HTML 模板
在你的项目目录下,创建一个名为 templates 的文件夹,并在其中创建一个 article_list.html 文件。
这个文件包含了一些 Jinja2 的模板语法:
{% for ... %}: 循环遍历数据。- 打印变量的值。
{% if ... %}: 条件判断。
templates/article_list.html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">文章列表</title>
<style>
body { font-family: sans-serif; margin: 2em; }
h1 { color: #333; }
.article-card {
border: 1px solid #ddd;
padding: 15px;
margin-bottom: 15px;
border-radius: 5px;
}
.article-title { color: #0056b3; }
.article-meta { font-size: 0.8em; color: #666; margin-bottom: 10px; }
</style>
</head>
<body>
<h1>从数据库提取的文章列表</h1>
<div class="articles-container">
{# 这是一个注释 #}
{% for article in articles %}
<div class="article-card">
<h2 class="article-title">{{ article.title }}</h2>
<p class="article-meta">
作者: {{ article.author }} | 发布日期: {{ article.publish_date }}
</p>
<p>
{{ article.content }}
</p>
</div>
{% else %}
<p>没有找到任何文章。</p>
{% endfor %}
</div>
</body>
</html>
第三步:编写 Python 脚本进行数据提取和渲染
我们编写主脚本来连接数据库、查询数据并使用 Jinja2 渲染模板。
generate_html.py
import sqlite3
from jinja2 import Environment, FileSystemLoader
def main():
# 1. 连接到数据库
try:
# 使用 'with' 语句可以自动处理连接的关闭
with sqlite3.connect('mydatabase.db') as conn:
# 设置 row_factory 使得查询结果像字典一样通过列名访问
conn.row_factory = sqlite3.Row
cursor = conn.cursor()
# 2. 执行 SQL 查询
cursor.execute("SELECT * FROM articles ORDER BY publish_date DESC")
# fetchall() 获取所有结果,返回一个列表,列表中的每个元素是一个 sqlite3.Row 对象
articles_data = cursor.fetchall()
print(f"成功从数据库获取 {len(articles_data)} 条文章数据。")
except sqlite3.Error as e:
print(f"数据库错误: {e}")
return
# 3. 设置 Jinja2 环境
# 指定模板文件夹的路径
file_loader = FileSystemLoader('templates')
# 创建一个环境对象
env = Environment(loader=file_loader)
# 4. 加载模板文件
try:
template = env.get_template('article_list.html')
except Exception as e:
print(f"模板加载错误: {e}")
return
# 5. 渲染模板
# 将 Python 字典传递给模板
# sqlite3.Row 对象可以像字典一样使用,所以可以直接传递
output = template.render(articles=articles_data)
# 6. 将渲染后的 HTML 写入文件
with open('output.html', 'w', encoding='utf-8') as f:
f.write(output)
print("HTML 文件已成功生成: output.html")
if __name__ == '__main__':
main()
第四步:运行和查看结果
-
确保你的项目目录结构如下:
/your_project ├── mydatabase.db (由 setup_database.py 创建) ├── setup_database.py ├── generate_html.py └── /templates └── article_list.html -
在终端中运行主脚本:
python generate_html.py
-
你会看到终端输出:
成功从数据库获取 3 条文章数据。 HTML 文件已成功生成: output.html -
在项目根目录下会新生成一个
output.html文件,用浏览器打开它,你将看到一个美观的、数据来自数据库的 HTML 页面。
进阶:使用 Web 框架 (Flask 示例)
在实际的 Web 应用中,你不会先生成一个静态 HTML 文件,而是使用 Web 框架(如 Flask 或 Django)来动态地生成和响应 HTML。
这里是一个使用 Flask 的简单例子:
-
安装 Flask
pip install Flask
-
创建 Flask 应用 (
app.py)from flask import Flask, render_template import sqlite3 app = Flask(__name__) def get_db_connection(): conn = sqlite3.connect('mydatabase.db') conn.row_factory = sqlite3.Row # 允许通过列名访问 return conn @app.route('/') def index(): conn = get_db_connection() articles = conn.execute('SELECT * FROM articles ORDER BY publish_date DESC').fetchall() conn.close() # render_template 会自动在 'templates' 文件夹中查找模板 # 并将 articles 变量传递给它 return render_template('article_list.html', articles=articles) if __name__ == '__main__': app.run(debug=True) -
运行 Flask 应用
python app.py
-
访问页面 打开浏览器,访问
http://127.0.0.1:5000,你将看到和之前output.html完全一样的页面,但现在它是动态生成的,每次刷新页面,Flask 都会重新从数据库查询数据并渲染页面。
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| Python 脚本生成静态文件 | 简单、直接,不依赖 Web 服务器。 | 生成的页面是静态的,无法实时更新。 | 生成报告、文档、静态网站内容。 |
| Web 框架 (Flask/Django) | 动态、交互式,适合构建真正的 Web 应用。 | 需要理解 Web 框架的概念,部署稍复杂。 | 几乎所有现代网站和 Web 应用。 |
对于初学者,建议从 Python 脚本生成静态文件 的方式开始,因为它清晰地展示了数据提取和模板渲染的核心逻辑,当你需要构建动态网站时,再学习 Flask 或 Django 这样的 Web 框架。
