APIRouter
当然可以!理解 FastAPI 中直接在 FastAPI 实例上定义路由与使用 APIRouter 作为路由器的区别,对于编写结构良好、可维护性高的应用程序至关重要。下面,我将详细解释这两种方法的区别、各自的优缺点以及何时使用它们。
1. 直接在 FastAPI 实例上定义路由
示例代码
from fastapi import FastAPIapp = FastAPI()@app.get("/")
async def read_root():return {"message": "Hello, FastAPI!"}@app.get("/items/{item_id}")
async def read_item(item_id: int):return {"item_id": item_id}
特点
- 简单直接:适用于小型应用或学习阶段,直接在
FastAPI实例上定义路由,便于快速上手。 - 易于理解:所有路由集中在一个文件中,逻辑清晰。
优点
- 快速开发:适合快速搭建原型或小型项目,无需额外的组织结构。
- 低复杂性:不需要处理额外的路由器对象,代码量少,学习曲线低。
缺点
- 可扩展性差:随着项目规模的扩大,所有路由集中在一个文件中,导致文件过大、难以维护。
- 复用性低:难以将路由逻辑分离到不同的模块或文件中,代码复用性差。
- 协作开发困难:多人协作时,集中在一个文件中的路由可能导致代码冲突和管理混乱。
2. 使用 APIRouter 作为路由器
示例代码
项目结构
为了更好地组织代码,我们通常采用模块化的项目结构。例如:
my_fastapi_app/
├── app/
│ ├── __init__.py
│ ├── main.py
│ ├── routers/
│ │ ├── __init__.py
│ │ ├── items.py
│ │ └── users.py
│ └── models/
│ ├── __init__.py
│ └── ...
├── requirements.txt
└── .gitignore
创建路由器文件 (routers/items.py)
from fastapi import APIRouterrouter = APIRouter(prefix="/items", # 所有路由的前缀tags=["items"], # 在文档中分组responses={404: {"description": "Not found"}}
)@router.get("/")
async def read_items():return [{"item_id": "Foo"}, {"item_id": "Bar"}]@router.get("/{item_id}")
async def read_item(item_id: int):return {"item_id": item_id}
创建另一个路由器文件 (routers/users.py)
from fastapi import APIRouterrouter = APIRouter(prefix="/users",tags=["users"],responses={404: {"description": "User not found"}}
)@router.get("/")
async def read_users():return [{"username": "alice"}, {"username": "bob"}]@router.get("/{username}")
async def read_user(username: str):return {"username": username}
主应用文件 (main.py)
from fastapi import FastAPI
from app.routers import items, users # 导入路由器app = FastAPI(title="My FastAPI App",description="这是一个使用 APIRouter 的示例应用",version="1.0.0"
)# 包含路由器
app.include_router(items.router)
app.include_router(users.router)@app.get("/")
async def read_root():return {"message": "Welcome to My FastAPI App!"}
特点
- 模块化:将相关的路由组织在不同的路由器(APIRouter)中,每个路由器负责特定的功能模块。
- 可扩展性高:适合大型应用,可以轻松添加新的模块和路由。
- 复用性强:路由器可以在多个地方复用,提高代码复用性。
- 协作友好:团队成员可以各自负责不同的路由器,减少代码冲突,提升协作效率。
优点
- 组织良好:通过将路由逻辑分散到不同的路由器文件中,代码结构清晰、易于维护。
- 易于扩展:添加新功能只需创建新的路由器并包含到主应用中,无需修改现有的路由器。
- 提升可读性:每个路由器专注于特定的功能模块,便于理解和管理。
- 支持依赖注入:可以在路由器级别设置依赖,进一步增强代码的模块化和可测试性。
缺点
- 初始设置稍复杂:相比直接在
FastAPI实例上定义路由,使用APIRouter需要额外的文件和组织结构。 - 学习曲线略高:对于初学者来说,理解路由器的概念和如何组织代码可能需要一些时间。
3. 何时使用 APIRouter?
- 项目规模:当应用变得较大,路由数量增多时,使用
APIRouter有助于保持代码的整洁和可维护性。 - 功能模块化:当需要将不同功能(如用户管理、物品管理、订单处理等)分离到不同的模块时,
APIRouter非常适合。 - 团队协作:在多人开发环境下,
APIRouter允许不同开发者专注于不同的路由器,减少代码冲突。 - 代码复用:当需要在多个地方复用相同的路由逻辑时,
APIRouter提供了更好的复用机制。
4. 深入理解 APIRouter 的功能
4.1 路由前缀(prefix)
通过设置路由器的 prefix,可以为所有包含的路由添加统一的前缀。例如,prefix="/items" 意味着路由器中的所有路由都会以 /items 开头。
router = APIRouter(prefix="/items")
如果路由器中定义了一个 @router.get("/"),实际访问路径为 /items/。
4.2 标签(tags)
通过设置 tags,可以在自动生成的文档中对路由进行分组,提升文档的可读性。
router = APIRouter(tags=["items"])
4.3 响应模型(responses)
可以为路由器中的所有路由定义默认的响应模型或描述。
router = APIRouter(responses={404: {"description": "Not found"}}
)
这将在文档中为所有路由添加404错误的描述。
4.4 路由器嵌套
APIRouter 支持路由器的嵌套,进一步增强模块化。例如,可以在 routers/users.py 中包含另一个路由器。
5. 综合比较
| 特性 | 直接在 FastAPI 实例上定义路由 | 使用 APIRouter |
|---|---|---|
| 代码组织 | 所有路由集中在一个文件中 | 路由分散在多个路由器文件中 |
| 适用场景 | 小型应用或学习阶段 | 大型应用或团队协作开发 |
| 可维护性 | 随着路由增多,维护困难 | 模块化组织,易于维护 |
| 复用性 | 低 | 高 |
| 协作开发 | 可能导致代码冲突 | 不同路由器由不同开发者维护 |
| 复杂性 | 简单 | 略高 |
6. 实际应用中的最佳实践
6.1 模块化设计
将相关的路由逻辑分组到不同的路由器中,每个路由器负责特定的功能模块。例如:
routers/users.py负责用户相关的路由routers/items.py负责物品相关的路由routers/orders.py负责订单相关的路由
6.2 使用依赖注入
APIRouter 支持依赖注入,使得路由器可以拥有自己的依赖,这有助于进一步模块化和测试。
from fastapi import Dependsdef get_db():# 模拟数据库依赖return "Database Connection"router = APIRouter()@router.get("/items/")
async def read_items(db=Depends(get_db)):return {"db": db}
6.3 分离认证逻辑
可以为不同的路由器设置不同的认证依赖,使得每个模块的安全逻辑更加清晰。
from fastapi import Depends, HTTPException, statusdef get_current_user():# 模拟用户认证return "current_user"router = APIRouter(dependencies=[Depends(get_current_user)]
)@router.get("/protected")
async def protected_route():return {"message": "This is a protected route"}
7. 结论
何时使用哪种方法?
- 小型项目或学习阶段:可以直接在
FastAPI实例上定义路由,简单快速。 - 中大型项目或团队协作:建议使用
APIRouter进行模块化路由组织,提升代码的可维护性和可扩展性。
综合推荐
在实际开发中,随着项目的增长,通常会从直接在 FastAPI 实例上定义路由逐渐转向使用 APIRouter。即便是在小型项目中,使用 APIRouter 也有助于保持代码的整洁和可扩展性,特别是当你预见到项目可能会扩展时。
继续学习与实践
- FastAPI 文档:https://fastapi.tiangolo.com/
- APIRouter 详解:FastAPI 路由器
- 依赖注入:FastAPI 依赖
- 中间件:FastAPI 中间件
相关文章:
APIRouter
当然可以!理解 FastAPI 中直接在 FastAPI 实例上定义路由与使用 APIRouter 作为路由器的区别,对于编写结构良好、可维护性高的应用程序至关重要。下面,我将详细解释这两种方法的区别、各自的优缺点以及何时使用它们。 1. 直接在 FastAPI 实例…...
算法模板2:位运算+离散化+区间合并
文章目录 1.6 位运算**位运算的常见应用**1.7 离散化**经典离散化题目例子****1. 区间合并和覆盖长度问题****2. 区间查询与修改****3. 动态求第 K 小值****4. 区间最大重叠次数****5. 动态逆序对计数****6. 二维区间问题****7. 模拟车流/时间段事件****8. 区间众数统计** **具…...
钉钉授权登录
一.找开钉钉开发平台【钉钉开放平台 (dingtalk.com)】 二。点击菜单【应用开发】->左边【钉钉应用】->【创建应用】 三。创建应用-》保存成功后,点击自己【新建的应用】,进入详细页面 四。进入应用详细页面。左边【分享设置】 注意:进…...
【视频】二维码识别:libzbar-dev、zbar-tools(zbarimg )
1、简介 ZBar可以使用多个方式识别各种条形码和二维码。 支持的格式有:EAN-13/UPC-A、UPC-E、EAN-8、Code 128、Code 93、Code 39、Codabar、Interleaved 2 of 5、QR Code和SQ Code 支持的来源有:视频流、图像文件等 libzbar-dev:二维码识别开发库 zbar-tools(zbarimg …...
C语言中的结构体,指针,联合体的使用
目录 1. 概述2. 定义和初始化3. 成员的使用4. 结构体数组5. 结构体套结构体6. 结构体赋值7. 结构体和指针8. 结构体作为函数参数9. 共用体(联合体)10. typedef就是取别名总结 1. 概述 数组:连续的相同数据类型的集合 结构体:不同…...
基于卡尔曼滤波器的 PID 控制
基于卡尔曼滤波器的PID控制算法结合了经典控制理论和现代信号处理技术。卡尔曼滤波器(Kalman Filter, KF)可以对噪声数据进行平滑处理,从而改善PID控制器的性能,特别是在处理具有噪声和不确定性的系统时。以下是详细的设计过程&am…...
CVE-2022-26201
打开是这么个页面 左上角找到Admin访问 里面有个Add Users,访问一下,能创建用户,有个能上传图片的地方 普通的一句话木马无法访问flag,需要创建一个权限马 <?php system($_GET[1]);phpinfo();?> 因为只能上传jpg形式的文…...
海信Java后端开发面试题及参考答案
TCP 的优点是什么? TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,它具有众多优点。 首先,TCP 提供可靠的传输服务。它通过序列号、确认应答、重传机制等确保数据的准确无误传输。例如,在发送数据时,发送方会…...
传智杯 3-初赛:终端
题目描述: 有一天您厌烦了电脑上又丑又没用的终端,打算自己实现一个 Terminal。具体来说,它需要支持如下命令: 1. touch filename:如果名为 filename 的文件不存在,就创建一个这样的文件,如果已经存在同名…...
大数据新视界 -- Hive 数据分区:精细化管理的艺术与实践(上)(7/ 30)
💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...
【中间件】Redis
一、什么是Redis Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。它支持字符串、哈希表、列表、集合、有序集合,位图,hyperloglogs等数据类型。内置…...
RTSP播放器EasyPlayer.js播放器分辨率高的视频在设置container的宽高较小时,会出现锯齿状的画面效果
流媒体播放器的核心技术及发展趋势展现了其在未来数字生活中的无限潜力。随着技术的不断进步和市场的持续发展,流媒体播放器将在内容创新、用户体验优化以及跨平台互通等方面取得新的突破。对于从业者而言,把握这些趋势并积极应对挑战将是实现成功的关键…...
Java爬虫:获取商品详情的实践之旅
在当今这个信息爆炸的时代,数据的价值日益凸显。对于电商行业来说,商品详情的获取尤为重要,它不仅关系到产品的销售,还直接影响到用户体验。传统的人工获取方式耗时耗力,而自动化的爬虫技术则提供了一种高效解决方案。…...
行业分析---2024年小鹏汽车AI Day及三季度财报
1 背景 在之前的博客中,笔者撰写了多篇行业类分析的文章(科技新能源): 《行业分析---我眼中的Apple Inc.》 《行业分析---马斯克的Tesla》 《行业分析---造车新势力之蔚来汽车》 《行业分析---造车新势力之小鹏汽车》 《行业分析-…...
写时复制,读时加载
实现写时复制,读时加载,原理为,申请内存时,只给一段线性地址空间,并不分配物理内存,当cpu读、写该内存时,发生缺页中,或者写错误,中断处理程序根据前面设置的内容&#x…...
Python和R基因组及蛋白质组学和代谢组学
🌵Python片段 1. 数据处理与清理 基因组病理学的数据通常非常庞大,且可能包括 DNA 或 RNA 测序结果、基因表达数据等。Python 提供了高效的数据处理工具。 工具和库 Pandas: 用于加载、清理和操作数据。Numpy: 用于高效的数值计算。Dask: 用于大规模数…...
selenium环境搭建详细过程
一、准备工作 在开始搭建 Selenium 环境之前,确保具备以下条件: 1.稳定的网络连接: 以便能够下载所需的软件和驱动程序。 2.操作系统基础: 对您的操作系统(如 Windows、Mac 或 Linux)有基本的了解和操…...
Linux知识 - VIM
VI于VIM linux系统里边内置了一个编辑器就叫做vi(visual editor),但vi的功能非常有限,所以一般Linux的使用人员会选择一个比vi更强大的编辑器vim Vim的三种工作模式 输入模式 在正常模式中按下别字母键,会进入插入模式…...
【数据结构】链表重难点突破
目录 一、链表的概念 二、链表的实现 2.1 链表的构建 2.2 从链表头部添加元素 2.3 从链表尾部添加元素 2.4 链表任意位置添加元素 2.5 常规方法实现 2.6 获取指定位置的元素 2.7 获取指定元素的位置 2.8 修改链表中某一节点 2.9 删除链表的头结点 2.10 删除链表的尾…...
大宗商品行业区块链应用
应用场景 区块链技术具有透明性、去中心化、不可篡改等特点,因此可以在大宗商品定价方面得到应用。通过区块链技术,相关交易的各方可以在无需依赖中心化第三方的情况下,实时、准确地获取定价信息。这种技术的应用能够提高效率、降低成本、提…...
3分钟掌握:AI 3D建模神器Wonder3D,单图转3D的终极指南
3分钟掌握:AI 3D建模神器Wonder3D,单图转3D的终极指南 【免费下载链接】Wonder3D Single Image to 3D using Cross-Domain Diffusion for 3D Generation 项目地址: https://gitcode.com/gh_mirrors/wo/Wonder3D Wonder3D是一个革命性的AI 3D建模工…...
3步解锁:开源工具Applera1n完全指南——iOS 15-16激活锁绕过方案
3步解锁:开源工具Applera1n完全指南——iOS 15-16激活锁绕过方案 【免费下载链接】applera1n icloud bypass for ios 15-16 项目地址: https://gitcode.com/gh_mirrors/ap/applera1n Applera1n是一款专为iOS 15-16系统设计的免费开源激活锁绕过工具ÿ…...
毕业论文查重不花一分钱?书匠策AI这个免费功能,90%的同学还不知道!
嗨,同学们好,我是你们的论文写作科普搭子。 今天要跟大家聊一个所有毕业生都绕不开的坎——论文查重。 先问大家一个扎心的问题:你的论文查重花了多少钱? 我见过有同学前前后后查了五六次,光查重费就花了上千块。更…...
Struts2 S2-061漏洞深度解析:OGNL沙箱绕过与零代码应急加固
1. 这个漏洞不是“又一个Struts2漏洞”,而是权限失控的临界点S2-061(CVE-2020-17530)在2020年12月被Apache官方披露,但直到2022年中后期,我在三家不同行业的客户现场做渗透复测时,仍发现超过40%的存量Strut…...
预测增强蒙特卡洛:用机器学习加速高成本仿真
1. 项目概述:当蒙特卡洛遇上机器学习在金融工程、量化风控乃至医疗资源模拟这些对精度和可靠性要求极高的领域,蒙特卡洛(Monte Carlo, MC)仿真是我们绕不开的基石工具。它的魅力在于“简单粗暴”的有效性:通过生成大量…...
Thorium浏览器:面向企业级部署的技术选型与架构决策指南
Thorium浏览器:面向企业级部署的技术选型与架构决策指南 【免费下载链接】thorium Chromium fork named after radioactive element No. 90. Source code and Linux releases. Windows/MacOS/ARM builds served in different repos, links are towards the top of t…...
保姆级教程:在CentOS 7/8上从源码编译安装最新版ProxyChains-ng(含systemd服务配置)
CentOS 7/8源码编译ProxyChains-ng全指南:从构建到系统服务集成对于追求极致控制力的技术爱好者来说,预编译软件包就像黑箱操作——你永远不知道里面被加入了什么。本文将带你深入ProxyChains-ng的构建过程,从源码编译到系统服务集成…...
FuSa RTX RTOS多核支持与AMP架构解析
1. FuSa RTX RTOS多核支持解析 在嵌入式安全关键系统开发领域,多核处理器架构已成为提升性能的主流选择。作为Arm FuSa RTS(功能安全运行时系统)的核心组件,FuSa RTX RTOS的多核支持能力自然成为开发者关注的焦点。本文将深入剖析…...
刚刚,马斯克第三代星舰首飞成功!
克雷西 发自 凹非寺量子位 | 公众号 QbitAI刚刚,马斯克的第十二次星舰试验,也是第三代星舰的首次飞行,顺利完成!当地时间昨天下午5点30分(北京时间今早6点30分),33台猛禽3发动机同时点火&#x…...
5步掌握Poppler-Windows部署:解决Windows环境PDF处理难题
5步掌握Poppler-Windows部署:解决Windows环境PDF处理难题 【免费下载链接】poppler-windows Download Poppler binaries packaged for Windows with dependencies 项目地址: https://gitcode.com/gh_mirrors/po/poppler-windows 对于需要在Windows平台进行PD…...
