一个全栈、实时的库存追踪应用,基于 FastAPI、WebSocket 和 PostgreSQL 构建。本项目旨在演示如何构建一个高度互动、异步的现代化Web服务。
用户可以通过前端界面添加、更新和删除库存物品,所有更改都会被即时广播到所有连接的客户端,无需刷新页面。
- ⚡️ 纯正的实时体验:本项目核心功能深度依赖 PostgreSQL 的
LISTEN/NOTIFY数据库级特性,配合 WebSockets,将任何数据变更即时、高效地推送给所有客户端。 - 🚀 现代化异步后端:后端基于 FastAPI 和 SQLAlchemy 2.0 构建,充分利用 Python 的
async/await语法实现高性能的非阻塞I/O。 - 🔗 健壮的连接管理:服务器能够有效管理多个 WebSocket 连接,并优雅地处理客户端的断连与重连。
- 🛡️ 安全与稳定:
- 包含健康检查接口 (
/health,/db-check),便于生产环境监控。 - 前端通过HTML转义来防止XSS攻击。
- WebSocket客户端具备自动重连机制,提升用户体验。
- 包含健康检查接口 (
- 🌐 轻量级原生前端:一个简洁、轻快的用户界面,完全由原生 JavaScript (ES6 Class)、HTML 和 CSS 构建,无需任何重型框架。
本应用采用解耦的事件驱动架构来实现实时功能,其核心是 PostgreSQL 数据库。
- 客户端 (浏览器):用户通过标准的 REST API 调用后端,执行一项CRUD操作(例如,添加一个新物品)。
- FastAPI 后端:后端处理 API 请求,并在 PostgreSQL 数据库中执行相应的操作。
- 数据库触发器:
inventory表上的一个SQL触发器在数据发生任何变化(INSERT,UPDATE,DELETE)时自动触发。 - Postgres NOTIFY:触发器通过
pg_notify()函数将一个JSON格式的载荷发送到一个指定的频道 (inventory_channel)。 - 通知服务:FastAPI 应用内部一个专用的异步服务,持续
LISTEN(监听)着这个 PostgreSQL 频道。 - WebSocket 广播:在收到通知后,该服务将消息传递给 WebSocket 连接管理器,后者将其广播给所有已连接的客户端。
- UI 更新:客户端的 JavaScript 接收到 WebSocket 消息,并动态更新界面以反映数据的最新变化。
+----------+ (1) REST API +-----------------+ (2) CRUD +-------------+
| | ---------------------> | | -----------------> | |
| 客户端 | | FastAPI 后端 | | PostgreSQL |
| (浏览器) | (7) WS 更新 | | <----------------- | (含触发器) |
| | <--------------------- | (通知器 + WS) | (4) pg_notify() | |
+----------+ +-----------------+ <----------------- +-------------+
^ (6) 广播
|
(5) 监听 `inventory_channel` 频道
- 后端: Python 3.13+, FastAPI, SQLAlchemy (async), Uvicorn
- 数据库: PostgreSQL (必需)
- 实时通信: WebSockets, PostgreSQL LISTEN/NOTIFY
- 前端: HTML5, CSS3, 原生 JavaScript (ES6)
- Python 3.13 或更高版本
- PostgreSQL 实例 (必需)
- 包管理工具
uv
git clone https://github.com/your-username/realtime-tracker.git
cd realtime-tracker本项目使用 uv 管理。
# 创建虚拟环境
uv venv# 使用 pyproject.toml 文件安装所有依赖
uv sync复制环境变量示例文件,并根据您的 PostgreSQL 信息进行修改。
cp .env.example .env然后,编辑 .env 文件。
重要提示: 本项目深度依赖 PostgreSQL 的 LISTEN/NOTIFY 机制来实现核心的实时推送功能,因此必须使用 PostgreSQL 数据库。代码中保留的 SQLite 配置仅为项目模板残留,并未适配此项目的实时特性。
请确保您的 .env 文件配置如下:
# .env
DB_TYPE=postgres
DB_HOST=localhost
DB_PORT=5432
DB_USER=your_postgres_user
DB_PASSWORD=your_postgres_password
DB_NAME=your_database_name
# 其他连接池配置可按需调整
POOL_SIZE=20
MAX_OVERFLOW=10服务器启动时,会自动创建所需的数据库和表。
uvicorn app.main:app --reload打开您的浏览器并访问 http://127.0.0.1:8000
您可以打开多个浏览器窗口来观察实时同步更新的效果!
- 微信公众号:码间絮语
- 欢迎 Star ⭐ & 关注,获取最新教程和代码更新。
本项目采用 MIT 许可。详情请见 LICENSE 文件。
Copyright (c) 2025 Aaron Lee
