FastAPI 基于 APIRouter 实例的路由注册

前言

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

什么是 APIRouter?

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

使用 APIRouter 的优势

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

使用案例

python 复制代码
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,代码如下

scss 复制代码
app = FastAPI()
​
app.include_router(router_login)
app.include_router(router_pay)

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

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

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

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

示例:

python 复制代码
@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": "支付成功"}
​

启动服务,我们在看看效果

最后

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

相关推荐
Ws_39 分钟前
leetcode LCR 068 搜索插入位置
数据结构·python·算法·leetcode
lx学习1 小时前
Python学习26天
开发语言·python·学习
qq_273900232 小时前
pytorch register_buffer介绍
人工智能·pytorch·python
大今野2 小时前
python习题练习
开发语言·python
camellias_3 小时前
SpringBoot(二十三)SpringBoot集成JWT
java·spring boot·后端
tebukaopu1483 小时前
springboot如何获取控制层get和Post入参
java·spring boot·后端
昔我往昔3 小时前
SpringBoot 创建对象常见的几种方式
java·spring boot·后端
q567315233 小时前
用 PHP或Python加密字符串,用iOS解密
java·python·ios·缓存·php·命令模式
灭掉c与java3 小时前
第三章springboot数据访问
java·spring boot·后端
啊松同学3 小时前
【Java】设计模式——工厂模式
java·后端·设计模式