掘金 后端 ( ) • 2024-04-09 14:03

前言

前段时间使用FastApi重构了Java代码覆盖率统计服务,当然是基于快速简单的FastApi使用,现在把知识延伸,深挖一下每个知识点,对于FastApi路由注册,我们刚接触框架时,最简单的注册方法就是:基于app实例对象提供的装饰器或函数进行注册。但在查看一些优秀的开源源码时,好多使用的APIRouter,那就先看看APIRouter如何注册路由呢?

什么是 APIRouter?

APIRouter 是 FastAPI 中的一个类,用于定义和管理路由。它允许你将一组相关的路由和处理函数组织在一起,形成一个独立的模块化单元,以便更好地组织和管理你的 API。

使用 APIRouter 的优势

  • 模块化组织: 可以将相关的路由和处理函数组织在一个 APIRouter 实例中,使得代码结构更加清晰和易于维护。
  • 路由重用: 可以将同一个 APIRouter 实例在多个地方引用,实现路由的重用,避免重复编写相同的路由配置。
  • 路由前缀: 可以为 APIRouter 实例指定一个统一的前缀,用于统一管理相关路由的路径。
  • 异常处理: 可以在 APIRouter 实例上注册异常处理器,对特定路由的异常进行定制化处理。

使用案例

from fastapi import FastAPI, APIRouter
​
​
router_login = APIRouter(prefix="/login", tags=["登录模块"])
router_pay = APIRouter(prefix="/pay", tags=["支付模块"])
​
@router_login.get("")
async def login():
    return {"message": "登录成功"}
​
@router_pay.get("/order")
async def pay():
    return {"message": "支付成功"}

上面的代码中,引入了APIRouter这个新类,通过该类实例化两个不同的APIRouter对象,并将它们分别绑定关联到login()和pay()两个视图函数上。

  • prefix:当前整个全局路由对象请求URL地址前缀。
  • tags:API分组归属标签。

我们已经完成路由分组和对应视图函数绑定,然后在 FastAPI 应用程序中注册 APIRouter,代码如下

app = FastAPI()
​
app.include_router(router_login)
app.include_router(router_pay)

上面代码中使用app.include_router()把APIRouter对象添加到app路由列表里面。include_router()函数的执行过程其实就是把所有子router中的路由都拆解出来并添加到根router,经过处理后,路由节点就注册完成了

好了,我们启动服务看看效果 image.png

给路由配置多个HTTP请求方法

APIRouter实例对象提供api_route的装饰器来支持配置多个HTTP请求方法

示例:

@router_login.api_route("", methods=["GET", "POST"])
async def login():
    return {"message": "登录成功"}
​
@router_pay.api_route("/order", methods=["GET", "POST"])
async def pay():
    return {"message": "支付成功"}
​

启动服务,我们在看看效果 image.png

最后

通过使用 APIRouter 实例,可以有效地组织和管理 FastAPI 应用程序中的路由,使得代码结构更加清晰和模块化。它提供了路由重用、路由前缀、异常处理等功能,为开发者提供了更好的开发体验和代码组织方式。
之后,决定再使用FastAPI搭建几个服务进行练手,后续也会输出相关文档,尽情期待吧!