一个现代化的 Python 项目模板,基于 FastAPI + SQLModel,集成了完整的开发工具链和最佳实践。
- FastAPI: 高性能异步 Web 框架
- SQLModel: 现代化 ORM,支持 SQLite/PostgreSQL
- Pydantic: 数据验证和序列化
- Uvicorn: ASGI 服务器
- uv: 极速 Python 包管理器
- Ruff: 快速代码检查和格式化
- Black: 代码格式化
- MyPy: 静态类型检查
- Pre-commit: Git 钩子确保代码质量
- Loguru: 强大的日志系统
- 结构化日志: 支持 JSON 格式
- 请求监控: 自动记录 HTTP 请求
- 性能分析: 执行时间监控
- Docker: 完整的容器化部署
- Docker Compose: 多服务编排
- PostgreSQL: 生产级数据库
- Redis: 缓存支持
- Pytest: 现代化测试框架
- 异步测试: 支持 async/await
- API 测试: FastAPI TestClient
- 数据库测试: 内存 SQLite
# 克隆项目
git clone <your-repo-url>
cd template-python
# 安装依赖
uv sync
# 启动应用
uv run python main.py
# 访问 API 文档
# Swagger UI: http://localhost:8000/docs
# ReDoc: http://localhost:8000/redoc
# 生产环境(PostgreSQL + Redis)
cd docker
docker-compose up -d
# 开发环境(SQLite)
docker-compose -f docker-compose.dev.yml up -d
# 使用 PostgreSQL(推荐生产环境)
cp .env.example .env
# 编辑 .env 文件,设置 DATABASE_URL=postgresql://...
# 重建数据库
python rebuild_db.py
# 安装生产依赖
uv sync --no-dev
# 安装开发依赖
uv sync
# 安装依赖
make install
# 代码格式化
make format
# 代码检查
make lint
# 类型检查
make type-check
# 运行测试
make test
# 运行测试(详细输出)
make test-verbose
# 运行测试并生成覆盖率报告
make test-cov
# 运行特定类型的测试
make test-unit # 单元测试
make test-integration # 集成测试
make test-api # API 测试
# 运行所有检查(包括测试)
make check-all
# 清理缓存
make clean
# Ruff - 代码检查和格式化
uv run ruff check . # 检查代码
uv run ruff check . --fix # 检查并自动修复
uv run ruff format . # 格式化代码
# Black - 代码格式化
uv run black . # 格式化代码
uv run black --check . # 检查格式(不修改)
# MyPy - 类型检查
uv run mypy . # 运行类型检查
# Pre-commit
uv run pre-commit run --all-files # 运行所有钩子
uv run pre-commit install # 安装钩子
项目使用 pytest 作为测试框架,支持单元测试、集成测试和 API 测试。
tests/
├── __init__.py # 测试包初始化
├── test_main.py # 主模块测试
├── test_api.py # FastAPI 应用测试
└── test_models.py # SQLModel 数据库模型测试
# 运行所有测试
uv run pytest
# 详细输出
uv run pytest -v
# 运行特定测试文件
uv run pytest tests/test_api.py
# 运行特定测试类
uv run pytest tests/test_api.py::TestFastAPIApp
# 运行特定测试方法
uv run pytest tests/test_api.py::TestFastAPIApp::test_read_root
# 按标记运行测试
uv run pytest -m unit
uv run pytest -m api
uv run pytest -m integration
# 生成覆盖率报告
uv run pytest --cov=. --cov-report=html --cov-report=term
# 查看 HTML 覆盖率报告
open htmlcov/index.html
- 单元测试:测试独立的函数和类
- API 测试:使用 FastAPI TestClient 测试 API 端点
- 数据库测试:使用内存 SQLite 数据库测试 SQLModel 模型
- 异步测试:支持 async/await 测试
- 测试标记:使用 pytest 标记组织和筛选测试
所有工具的配置都在 pyproject.toml
文件中:
- 启用了推荐的规则集(pycodestyle、pyflakes、isort 等)
- 行长度限制为 88 字符
- 针对 Python 3.11+ 优化
- 为测试文件和
__init__.py
提供特殊规则
- 行长度限制为 88 字符
- 目标 Python 版本 3.11
- 排除构建和分发目录
- 严格模式启用
- 要求所有函数都有类型注解
- 启用各种警告和检查
- 忽略测试文件的类型错误
项目配置了以下 pre-commit 钩子:
- Ruff - 代码检查和格式化
- Black - 代码格式化
- MyPy - 类型检查
- 通用钩子 - 文件格式检查、语法检查等
# 安装 pre-commit 钩子
uv run pre-commit install
# 手动运行所有钩子
uv run pre-commit run --all-files
# 更新钩子版本
uv run pre-commit autoupdate
项目包含 GitHub Actions 工作流(.github/workflows/ci.yml
),会在每次推送和 PR 时自动运行:
- 代码检查(Ruff)
- 格式检查(Ruff + Black)
- 类型检查(MyPy)
- Pre-commit 钩子验证
.
├── src/ # 源代码目录
│ ├── api/ # API 路由
│ │ └── v1/ # API v1 版本
│ │ └── endpoints/ # API 端点
│ ├── db/ # 数据库配置
│ ├── models/ # 数据模型
│ └── utils/ # 工具函数
├── tests/ # 测试代码
├── docker/ # Docker 配置
├── docs/ # 项目文档
├── logs/ # 日志文件
├── uploads/ # 文件上传目录
├── main.py # 应用入口
├── pyproject.toml # 项目配置
└── Makefile # 开发命令
GET /
- 欢迎页面GET /api/v1/health
- 健康检查GET /docs
- Swagger UI 文档GET /redoc
- ReDoc 文档
GET /api/v1/users
- 获取用户列表POST /api/v1/users
- 创建用户GET /api/v1/users/{user_id}
- 获取用户详情PUT /api/v1/users/{user_id}
- 更新用户DELETE /api/v1/users/{user_id}
- 删除用户
GET /api/v1/heroes
- 获取英雄列表POST /api/v1/heroes
- 创建英雄GET /api/v1/heroes/{hero_id}
- 获取英雄详情PUT /api/v1/heroes/{hero_id}
- 更新英雄DELETE /api/v1/heroes/{hero_id}
- 删除英雄
POST /api/v1/files/upload
- 单文件上传POST /api/v1/files/upload-multiple
- 多文件上传GET /api/v1/files/{file_id}/download
- 文件下载GET /api/v1/files/stats
- 上传统计
复制 .env.example
到 .env
并根据需要修改:
cp .env.example .env
主要配置项:
# 数据库配置
DATABASE_URL=sqlite:///./app.db # 开发环境
# DATABASE_URL=postgresql://user:pass@localhost:5432/db # 生产环境
# 应用配置
APP_NAME=FastAPI Template
DEBUG=false
# 日志配置
LOG_LEVEL=INFO
LOG_TO_CONSOLE=true
LOG_TO_FILE=true
项目支持多种数据库:
- SQLite(默认):适合开发和测试
- PostgreSQL:推荐生产环境
- MySQL:可选生产环境
切换数据库只需修改 DATABASE_URL
环境变量。
- 快速参考 - 常用命令和配置速查
- 更新日志 - 版本变更记录
- Makefile 命令 - 常用开发命令
- 环境变量 - 配置参数说明
-
环境准备
uv sync # 安装依赖 cp .env.example .env # 配置环境 uv run pre-commit install # 安装 Git 钩子
-
开发代码
uv run python main.py # 启动开发服务器 # 访问 http://localhost:8000/docs
-
代码检查
make format # 格式化代码 make lint # 代码检查 make type-check # 类型检查 make test # 运行测试
-
提交代码
git add . git commit -m "feat: 添加新功能" # Pre-commit 钩子会自动运行检查
- Fork 项目并创建功能分支
- 遵循代码规范:使用 Ruff + Black + MyPy
- 编写测试:确保新功能有对应测试
- 更新文档:如有必要更新相关文档
- 提交 PR:确保所有检查通过
使用 Conventional Commits 规范:
feat:
新功能fix:
修复 bugdocs:
文档更新style:
代码格式refactor:
重构test:
测试相关chore:
构建/工具相关
MIT License - 详见 LICENSE 文件