FastAPI -API Router的应用

APIRouter 是 FastAPI 框架中用于模块化组织路由的核心组件。你可以把它理解为一个"子应用"或"路由分组器"。

它的核心作用是帮助你将庞大的 API 接口拆分到不同的文件中进行管理,最后再统一挂载到主应用上,从而让项目结构更清晰、更易于维护。

为什么需要 APIRouter?

想象一下,你正在开发一个大型项目,如果不使用 APIRouter,所有的接口(如用户登录、商品管理、订单处理等)都会堆砌在 main.py 这一个文件中。随着项目扩大,这个文件会变得极其臃肿,查找和修改代码都会变得非常困难。

APIRouter 就像是为你提供了一个个"收纳盒",让你可以把不同功能的接口分门别类地放进去,最后再把所有"收纳盒"整齐地放进"大柜子"(主应用)里。

使用 APIRouter 的主要优势

  • 模块化拆分:将不同功能的接口(如用户、商品、订单)分到不同的文件中,代码结构清晰,符合单一职责原则。
  • 统一前缀管理 :通过 prefix 参数,可以为该组所有接口统一添加 URL 前缀(如 /users),无需在每个接口路径中重复书写。
  • 文档自动分组 :通过 tags 参数,可以让 FastAPI 自动生成的 Swagger 文档(/docs)中的接口按模块分组显示,更易读。
  • 模块级依赖注入:可以为整个路由组设置共同的依赖项(如身份验证),避免在每个接口中重复编写相同的逻辑。

如何使用 APIRouter

下面通过一个简单的例子来展示如何使用 APIRouter 来重构代码。

❌ 不使用 APIRouter (所有代码挤在 main.py)
复制代码
# main.py
from fastapi import FastAPI

app = FastAPI()

# 用户相关接口
@app.post("/users/login")
def login(): pass

@app.get("/users/info")
def get_user_info(): pass

# 商品相关接口
@app.post("/items/create")
def create_item(): pass

@app.get("/items/list")
def list_items(): pass
# 项目越大,main.py 越臃肿
✅ 使用 APIRouter (文件分离,结构清晰)

你可以将代码拆分成三个文件:

  1. routers/user.py (用户模块)

    复制代码
    from fastapi import APIRouter
    
    # 创建一个用户路由对象,并设置前缀和标签
    user_router = APIRouter(prefix="/users", tags=["用户管理"])
    
    @user_router.post("/login")
    def login():
        return {"msg": "登录成功"}
    
    @user_router.get("/info")
    def get_user_info():
        return {"name": "张三"}
  2. routers/item.py (商品模块)

    复制代码
    from fastapi import APIRouter
    
    # 创建一个商品路由对象
    item_router = APIRouter(prefix="/items", tags=["商品管理"])
    
    @item_router.post("/create")
    def create_item():
        return {"msg": "商品创建成功"}
    
    @item_router.get("/list")
    def list_items():
        return {"items": ["商品1", "商品2"]}
  3. main.py (主应用,只负责挂载路由)

    复制代码
    from fastapi import FastAPI
    from routers.user import user_router  # 导入用户路由
    from routers.item import item_router   # 导入商品路由
    
    app = FastAPI()
    
    # 把各个模块的路由「挂载」到主应用上
    app.include_router(user_router)
    app.include_router(item_router)

通过这种方式,你的项目结构会变得非常清晰,每个模块都独立在自己的文件中,极大地提升了代码的可读性和可维护性。

相关推荐
胡萝卜术6 分钟前
从暴力到滑动窗口的终极形态:力扣3「无重复字符的最长子串」的优化进化之路
前端·javascript·面试
代码的小搬运工3 小时前
网络请求(NSURL、NSURLRequest、NSURLSessionDataTask、协议回调与 JSON 数据的基本流向)
网络·数据库·json
蓝胖的四次元口袋8 小时前
服务器网络与系统基础-面试题
服务器·网络
钛态9 小时前
前端安全防线:CSRF 攻击链路与双重 Token 校验的工程实现
前端·vue·react·web
程序员JerrySUN9 小时前
Jetson 刷机深度解析:flash.sh vs l4t_initrd_flash.sh(含安全与磁盘加密对比)
linux·网络·arm开发·安全·系统安全
视觉AI10 小时前
VS Code Remote-SSH 连接Jetson踩坑完整解决记录(网段不通+主机密钥变更双重故障)
运维·网络·人工智能·windows·ssh·边缘计算
张拭心10 小时前
技术管理笔记:让我“燃尽”的一天
前端
明志数科10 小时前
人形机器人格斗场景下的技术挑战:动力学控制、感知融合与实时决策
网络·数据库
酉鬼女又兒10 小时前
零基础入门 DeepSeek V4 Pro API 开发:从环境搭建、消息格式规范到翻译函数实战、少样本提示、多轮对话聊天机器人与常见报错全流程详解指南
大数据·网络·数据库·人工智能·macos·机器人·github
欧神附体12310 小时前
在虚拟机中添加网卡,修改网卡名并关闭SElinux
linux·服务器·网络