项目架构说明
本文档基于当前项目代码整理,说明目录结构、各文件用途、应用启动流程和配置加载方式。
1. 项目概览
这是一个基于 FastAPI 的 Web 后端项目,目前处于基础骨架阶段。
- Web 框架:FastAPI
- ASGI 服务器:Uvicorn
- 数据校验:Pydantic
- 配置管理:Pydantic Settings
- Python 版本:3.14,项目要求 Python
>=3.14 - 依赖管理:uv,通过
pyproject.toml和uv.lock管理 - 应用组织方式:公共配置按功能划分,业务代码按
book、sys模块划分
当前已经实现:
- FastAPI 应用工厂。
- 开发、生产、测试三种启动入口。
- 基于
APP_ENV的多环境配置加载。 - 一个用于查看当前环境配置的
GET /config接口。
当前尚未实现:
book和sys模块中的具体业务代码。- 业务路由在主应用中的注册。
- 数据库连接、ORM 模型和数据库访问逻辑。
- 自动化测试代码。
2. 整体目录结构
demo1/
├── core/ # 公共核心能力
│ └── config.py # 环境配置定义与加载
├── modules/ # 业务模块根目录
│ ├── book/ # 图书业务模块
│ │ ├── modules.py # 当前为空的模块预留文件
│ │ ├── router.py # 图书路由预留文件
│ │ ├── schemas.py # 图书数据结构预留文件
│ │ └── service.py # 图书业务逻辑预留文件
│ └── sys/ # 系统业务模块
│ ├── modules.py # 当前为空的模块预留文件
│ ├── router.py # 系统路由预留文件
│ ├── schemas.py # 系统数据结构预留文件
│ └── service.py # 系统业务逻辑预留文件
├── .env # 默认环境配置
├── .env.dev # 开发环境配置
├── .env.prod # 生产环境配置
├── .env.test # 测试环境配置
├── .gitignore # Git 忽略规则
├── .python-version # 项目使用的 Python 版本
├── ARCHITECTURE.md # 项目架构说明,即本文档
├── README.md # 项目说明文件,当前为空
├── main.py # 应用创建、接口定义和启动入口
├── pyproject.toml # 项目元数据、依赖和命令入口
└── uv.lock # uv 生成的依赖锁定文件此外,项目目录中存在 .venv/,它是本地 Python 虚拟环境,包含解释器、启动脚本和第三方依赖。该目录由工具自动生成,不属于业务源码,因此不逐一说明其内部文件,也不应手动修改。
3. 分层与模块职责
3.1 应用入口层:main.py
负责把项目运行起来,主要包括:
- 通过
create_app()创建并配置 FastAPI 实例。 - 在应用工厂中延迟导入配置,确保启动函数已经设置
APP_ENV。 - 定义当前的
GET /config接口。 - 通过
_start()设置环境、监听地址、端口和重载行为。 - 提供
dev()、prod()、test()三个命令入口。
3.2 核心配置层:core/
目前只包含配置管理,不负责业务逻辑。
core/config.py 使用 BaseSettings 定义配置字段,并在模块导入时创建全局 settings 对象。应用通过该对象读取应用名称、环境、调试开关和数据库地址。
3.3 业务模块层:modules/
业务代码按照领域划分为:
book:图书相关业务。sys:系统相关业务。
两个模块目前具有相同的文件骨架,但所有文件均为空,也没有被 main.py 导入或注册。因此,它们目前只表示目录设计,不参与应用运行。
按照常见的 FastAPI 分层方式,这些预留文件可分别承担以下职责:
| 文件类型 | 规划职责 | 当前状态 |
|---|---|---|
router.py | 定义 APIRouter、HTTP 路径、请求参数和响应模型 | 空文件,未实现 |
schemas.py | 定义 Pydantic 请求、响应及数据传输结构 | 空文件,未实现 |
service.py | 承载业务规则、业务流程及数据访问协调 | 空文件,未实现 |
modules.py | 模块内的预留文件;当前没有代码,无法从现有实现确定更具体的用途 | 空文件,未实现 |
4. 每个文件的用途
4.1 根目录文件
| 文件 | 用途 |
|---|---|
main.py | 项目主入口。包含 FastAPI 应用工厂、/config 接口,以及开发、生产、测试三种 Uvicorn 启动函数。 |
pyproject.toml | 定义项目名称、版本、Python 版本要求、直接依赖、命令入口和 setuptools 构建配置。dev、prod、test 分别指向 main.py 中的同名函数。 |
uv.lock | 由 uv 自动生成和维护,锁定直接及间接依赖的准确版本、来源和校验信息,用于可重复安装;通常不应手动编辑。 |
.python-version | 指定项目使用的 Python 版本,当前为 3.14。 |
.gitignore | 指定 Git 应忽略的内容,目前包括 Python 缓存、构建产物、包信息以及 .venv 虚拟环境。 |
.env | 默认配置文件,提供应用名称、环境名称、调试开关和数据库连接字符串等基础值。 |
.env.dev | 开发环境配置,在 APP_ENV=dev 时与 .env 一起加载,用于覆盖开发环境所需的配置。 |
.env.prod | 生产环境配置,在 APP_ENV=prod 时加载;当前将调试模式关闭,并使用生产环境对应的应用配置。 |
.env.test | 测试环境配置,在 APP_ENV=test 时加载,用于隔离测试环境配置。 |
README.md | 项目说明文档,当前为空,尚未提供安装、启动或使用说明。 |
ARCHITECTURE.md | 当前架构文档,记录目录结构、文件职责、启动流程和配置加载方式。 |
4.2 核心配置目录
| 文件 | 用途 |
|---|---|
core/config.py | 从进程环境变量读取 APP_ENV,依次配置 .env 和对应环境的 .env.<环境> 文件,定义并实例化 Settings。 |
Settings 当前包含以下字段:
| 配置字段 | 对应环境变量 | 用途 |
|---|---|---|
app_name | APP_NAME | 作为 FastAPI 应用的 title。 |
app_env | APP_ENV | 标识当前环境,并由 /config 接口返回。 |
debug | DEBUG | 控制 FastAPI 的 debug 参数。 |
database_url | DATABASE_URL | 保存数据库连接字符串;目前仅用于配置读取和 /config 返回,尚未建立数据库连接。 |
4.3 图书业务模块
| 文件 | 用途 |
|---|---|
modules/book/modules.py | 当前为空的图书模块预留文件,尚无任何实现。 |
modules/book/router.py | 预留给图书相关 HTTP 路由;当前为空,未注册到 FastAPI 应用。 |
modules/book/schemas.py | 预留给图书相关 Pydantic 数据结构;当前为空。 |
modules/book/service.py | 预留给图书相关业务逻辑;当前为空。 |
4.4 系统业务模块
| 文件 | 用途 |
|---|---|
modules/sys/modules.py | 当前为空的系统模块预留文件,尚无任何实现。 |
modules/sys/router.py | 预留给系统相关 HTTP 路由;当前为空,未注册到 FastAPI 应用。 |
modules/sys/schemas.py | 预留给系统相关 Pydantic 数据结构;当前为空。 |
modules/sys/service.py | 预留给系统相关业务逻辑;当前为空。 |
5. 应用启动流程
5.1 启动入口
pyproject.toml 注册了三个命令:
| 命令 | 调用函数 | 环境 | 监听地址 | 端口 | 自动重载 |
|---|---|---|---|---|---|
uv run dev | main:dev | dev | 127.0.0.1 | 8000 | 开启 |
uv run prod | main:prod | prod | 0.0.0.0 | 8000 | 关闭 |
uv run test | main:test | test | 127.0.0.1 | 8000 | 关闭 |
5.2 启动调用链
dev / prod / test 命令
↓
main.py 中对应的启动函数
↓
_start(environment)
↓
设置进程环境变量 APP_ENV
↓
Uvicorn 以工厂模式加载 main:create_app
↓
create_app() 内延迟导入 core.config.settings
↓
读取默认配置和当前环境配置,创建 Settings 对象
↓
使用 APP_NAME 和 DEBUG 创建 FastAPI 应用
↓
注册 /config 接口并开始监听请求create_app() 是应用工厂,Uvicorn 通过 factory=True 调用它获得真正的 FastAPI 实例。配置采用延迟导入,是为了让 _start() 先设置 APP_ENV,再初始化 Settings。
6. 配置加载机制
core/config.py 使用以下两个配置文件来源:
.env
.env.${APP_ENV}例如,执行开发环境启动命令后:
APP_ENV=dev
↓
加载 .env
↓
加载 .env.dev
↓
生成 settings配置规则如下:
- 选择哪个环境文件,取决于进程环境变量
APP_ENV。 .env中的APP_ENV会作为配置字段被读取,但不能替代启动前对进程环境变量的设置,因为代码首先执行的是os.environ["APP_ENV"]。- 多个 env 文件中存在同名字段时,后加载的环境专属文件可以覆盖默认文件中的值。
- 操作系统环境变量的优先级高于 env 文件。
- 配置中未声明的额外字段会被忽略,因为设置了
extra="ignore"。 - 缺少必填配置或配置类型不正确时,
Settings()初始化会失败。
7. 当前接口与请求链路
目前项目只定义了一个业务外的配置查看接口:
| 方法 | 路径 | 功能 |
|---|---|---|
GET | /config | 返回当前环境名称和数据库连接字符串。 |
请求链路为:
客户端请求 GET /config
↓
FastAPI 路由匹配到 main.py 中的 index()
↓
读取全局 settings.app_env 和 settings.database_url
↓
返回 JSON 响应响应结构为:
{
"environment": "当前环境名称",
"database_url": "当前数据库连接字符串"
}book 和 sys 模块目前没有任何已注册接口,因此还不存在这些模块的实际请求处理链路。
8. 当前架构关系总结
main.py
├── 使用 core.config.settings 创建 FastAPI 应用
├── 提供 GET /config
└── 提供 dev / prod / test 启动入口
core/config.py
├── 读取进程中的 APP_ENV
├── 加载 .env 与对应环境文件
└── 创建全局 settings
modules/book/*
└── 空文件,预留图书业务结构,尚未接入主应用
modules/sys/*
└── 空文件,预留系统业务结构,尚未接入主应用整体来看,项目当前是一个“应用入口 + 多环境配置 + 业务模块预留目录”的 FastAPI 骨架。现阶段实际运行逻辑集中在 main.py 和 core/config.py,其余业务模块尚未进入请求处理流程。