FastAPI 教程

11.3 大型项目工厂模式与蓝图

FastAPI大型项目教程:工厂模式与蓝图详解

FastAPI 教程

本教程详细讲解如何在FastAPI大型项目中使用工厂模式和蓝图(通过APIRouter),帮助新人学习模块化代码组织,提高应用可测试性和可维护性,包含易懂示例和实践指南。

推荐工具
PyCharm专业版开发必备

功能强大的Python IDE,提供智能代码补全、代码分析、调试和测试工具,提高Python开发效率。特别适合处理列表等数据结构的开发工作。

了解更多

FastAPI大型项目教程:工厂模式与蓝图详解

介绍

在开发大型FastAPI项目时,代码的模块化和可维护性至关重要。本教程将介绍如何使用工厂模式和蓝图(在FastAPI中通过APIRouter实现)来组织代码,使项目结构清晰、易于扩展和测试。针对新人,我们将从基础概念开始,逐步深入,并提供详细示例。

为什么需要工厂模式和蓝图?

  • 蓝图(APIRouter):允许你将路由分组到独立的模块中,类似于小型应用,便于代码重用和分离关注点。这在大型项目中可以避免单个文件过于庞大。
  • 工厂模式:通过创建一个函数来生成FastAPI应用实例,可以灵活配置应用(如数据库连接、中间件等),并支持在不同环境(如开发、测试、生产)中使用不同设置。

蓝图在FastAPI中:使用APIRouter

在FastAPI中,蓝图的概念通过APIRouter类实现。它允许你定义路由并将其添加到主应用中。

基本用法

  1. 创建APIRouter实例:在模块中定义一个路由组。
  2. 添加路由:像在主应用中一样定义路径操作。
  3. 在应用中包含路由器:将路由器挂载到主FastAPI实例。

示例代码

假设我们有一个用户管理模块:

# routers/users.py
from fastapi import APIRouter, HTTPException

router = APIRouter(prefix="/users", tags=["users"])

@router.get("/")
async def get_users():
    return {"message": "获取用户列表"}

@router.post("/")
async def create_user():
    return {"message": "创建用户"}

然后在主应用中导入并包含:

# main.py
from fastapi import FastAPI
from routers import users

app = FastAPI()

app.include_router(users.router)

这样,所有用户相关路由都组织在/users路径下,并且可以通过标签分组。

工厂模式:创建灵活的应用实例

工厂模式涉及编写一个函数来创建和配置FastAPI应用实例。这在测试和配置管理中特别有用。

工厂函数示例

# app_factory.py
from fastapi import FastAPI
from routers import users

def create_app() -> FastAPI:
    app = FastAPI(title="My Large Project", version="1.0.0")
    
    # 添加路由器
    app.include_router(users.router)
    
    # 添加其他配置,如数据库连接、中间件等
    # 示例:添加一个简单的中间件
    from fastapi.middleware.cors import CORSMiddleware
    app.add_middleware(
        CORSMiddleware,
        allow_origins=["*"],
        allow_credentials=True,
        allow_methods=["*"],
        allow_headers=["*"],
    )
    
    return app

使用工厂函数

在主入口点(如main.py)中:

from app_factory import create_app

app = create_app()

if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8000)

这样做的好处是,你可以在测试中轻松创建应用实例,或在配置不同环境时传递参数。

结合工厂模式和蓝图的大型项目结构

对于大型项目,推荐以下结构:

my_project/
│
├── app/
│   ├── __init__.py
│   ├── main.py          # 主入口,使用工厂函数
│   ├── app_factory.py   # 工厂函数定义
│   ├── routers/         # 存放所有蓝图(APIRouter)
│   │   ├── __init__.py
│   │   ├── users.py
│   │   ├── items.py
│   │   └── ...
│   ├── models/          # 数据模型(可选)
│   ├── services/        # 业务逻辑(可选)
│   └── config.py        # 配置管理
│
├── tests/               # 测试文件,使用工厂函数创建测试应用
└── requirements.txt

完整示例

假设我们有一个更复杂的项目,包含用户和商品模块。

  1. 路由器模块
# app/routers/users.py
from fastapi import APIRouter

router = APIRouter(prefix="/users", tags=["users"])

@router.get("/")
async def get_users():
    return {"users": ["user1", "user2"]}
# app/routers/items.py
from fastapi import APIRouter

router = APIRouter(prefix="/items", tags=["items"])

@router.get("/")
async def get_items():
    return {"items": ["item1", "item2"]}
  1. 工厂函数
# app/app_factory.py
from fastapi import FastAPI
from .routers import users, items

def create_app() -> FastAPI:
    app = FastAPI()
    
    # 包含所有路由器
    app.include_router(users.router)
    app.include_router(items.router)
    
    # 可以添加全局依赖项或事件处理程序
    @app.on_event("startup")
    async def startup_event():
        print("应用启动")
    
    return app
  1. 主应用
# app/main.py
from app_factory import create_app

app = create_app()

if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8000)

最佳实践

  • 使用APIRouter的prefix和tags:使路由更清晰和易于文档化。
  • 在工厂函数中配置应用:便于测试和环境切换。
  • 保持模块独立:每个路由器应该处理特定的功能领域。
  • 编写测试:利用工厂函数创建测试应用,确保代码质量。

总结

通过本教程,你学习了如何在FastAPI大型项目中使用工厂模式和蓝图(APIRouter)。工厂模式提高了配置灵活性和可测试性,而蓝图(APIRouter)帮助模块化代码,使项目易于维护。建议在实际项目中实践这些模式,并根据需求调整结构。

如果你有更多问题,欢迎在社区讨论或查阅FastAPI官方文档。

开发工具推荐
Python开发者工具包

包含虚拟环境管理、代码格式化、依赖管理、测试框架等Python开发全流程工具,提高开发效率。特别适合处理复杂数据结构和算法。

获取工具包