0%

FastAPI自学教程(43) - 大型应用架构设计

1. 模块化设计

1
2
3
4
5
6
7
8
# routers/items.py
from fastapi import APIRouter

router = APIRouter(prefix="/items", tags=["商品管理"])

@router.get("/{item_id}")
async def read_item(item_id: int):
return {"item_id": item_id}
  • 使用APIRouter实现路由模块化,支持设置统一前缀和标签
  • 通过include_router将子模块路由注入主应用:
    1
    2
    3
    4
    5
    6
    # main.py
    from fastapi import FastAPI
    from routers import items

    app = FastAPI()
    app.include_router(items.router)
  • 支持嵌套路由分组,实现多层模块结构(如v1/users和v2/users)

2. 依赖注入系统

1
2
3
4
5
6
7
8
9
10
11
12
13
# dependencies.py
from fastapi import Depends, HTTPException

async def verify_token(x_token: str = Header(...)):
if not validate_token(x_token):
raise HTTPException(403)
return x_token

# routers/admin.py
from fastapi import Depends, APIRouter
from dependencies import verify_token

router = APIRouter(dependencies=[Depends(verify_token)])
  • 全局依赖:通过app = FastAPI(dependencies=[...])设置全局限流/认证
  • 模块级依赖:在APIRouter初始化时声明模块专用依赖
  • 支持异步依赖项管理数据库连接池等资源

3. 项目结构规范

1
2
3
4
5
6
7
8
9
10
11
myapp/
├── app/
│ ├── __init__.py
│ ├── main.py
│ ├── dependencies.py
│ ├── routers/
│ │ ├── items.py
│ │ └── users.py
│ └── internal/
│ └── admin.py
└── requirements.txt
  • main.py:应用入口,初始化FastAPI实例和路由集成
  • **routers/**:存放各业务模块路由定义(支持无限层级嵌套)
  • **internal/**:存放内部管理接口(如后台任务/监控端点)
  • dependencies.py:集中管理全局依赖项(数据库连接、认证等)

4. 版本控制实现

1
2
3
4
5
# routers/v1/items.py
router = APIRouter(prefix="/v1/items")

# main.py
app.include_router(v1_router, prefix="/api")
  • 通过路径前缀实现多版本API共存(如/api/v1/items)
  • 支持不同版本独立维护路由逻辑和响应模型
  • 文档自动分组展示不同版本接口

5. 中间件与全局配置

1
2
3
4
5
6
7
from fastapi.middleware.cors import CORSMiddleware

app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_methods=["*"]
)
  • 支持请求/响应拦截处理(如耗时统计、异常捕获)
  • 推荐中间件执行顺序:
      graph TD
      A[CORS] --> B[认证] --> C[请求处理] --> D[响应加工]
  • 通过@app.on_event("startup")初始化数据库连接等资源

生产环境建议

  1. 部署优化:使用Gunicorn+Uvicorn部署,配置worker数量
  2. 监控体系:集成Prometheus实现接口性能监控
  3. 配置管理:通过.env文件管理环境变量
  4. 安全加固:启用HTTPS并配置CORS白名单
  5. 日志规范:结构化日志记录请求全生命周期信息

测试命令示例:

1
uvicorn app.main:app --reload --port 8000