当前位置: 首页 > news >正文

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&#xff0c;访问一下&#xff0c;能创建用户&#xff0c;有个能上传图片的地方 普通的一句话木马无法访问flag&#xff0c;需要创建一个权限马 <?php system($_GET[1]);phpinfo();?> 因为只能上传jpg形式的文…...

海信Java后端开发面试题及参考答案

TCP 的优点是什么? TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,它具有众多优点。 首先,TCP 提供可靠的传输服务。它通过序列号、确认应答、重传机制等确保数据的准确无误传输。例如,在发送数据时,发送方会…...

传智杯 3-初赛:终端

题目描述&#xff1a; 有一天您厌烦了电脑上又丑又没用的终端&#xff0c;打算自己实现一个 Terminal。具体来说&#xff0c;它需要支持如下命令: 1. touch filename&#xff1a;如果名为 filename 的文件不存在&#xff0c;就创建一个这样的文件&#xff0c;如果已经存在同名…...

大数据新视界 -- Hive 数据分区:精细化管理的艺术与实践(上)(7/ 30)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...

【中间件】Redis

一、什么是Redis Redis是一个开源&#xff08;BSD许可&#xff09;&#xff0c;内存存储的数据结构服务器&#xff0c;可用作数据库&#xff0c;高速缓存和消息队列代理。它支持字符串、哈希表、列表、集合、有序集合&#xff0c;位图&#xff0c;hyperloglogs等数据类型。内置…...

RTSP播放器EasyPlayer.js播放器分辨率高的视频在设置container的宽高较小时,会出现锯齿状的画面效果

流媒体播放器的核心技术及发展趋势展现了其在未来数字生活中的无限潜力。随着技术的不断进步和市场的持续发展&#xff0c;流媒体播放器将在内容创新、用户体验优化以及跨平台互通等方面取得新的突破。对于从业者而言&#xff0c;把握这些趋势并积极应对挑战将是实现成功的关键…...

Java爬虫:获取商品详情的实践之旅

在当今这个信息爆炸的时代&#xff0c;数据的价值日益凸显。对于电商行业来说&#xff0c;商品详情的获取尤为重要&#xff0c;它不仅关系到产品的销售&#xff0c;还直接影响到用户体验。传统的人工获取方式耗时耗力&#xff0c;而自动化的爬虫技术则提供了一种高效解决方案。…...

行业分析---2024年小鹏汽车AI Day及三季度财报

1 背景 在之前的博客中&#xff0c;笔者撰写了多篇行业类分析的文章&#xff08;科技新能源&#xff09;&#xff1a; 《行业分析---我眼中的Apple Inc.》 《行业分析---马斯克的Tesla》 《行业分析---造车新势力之蔚来汽车》 《行业分析---造车新势力之小鹏汽车》 《行业分析-…...

写时复制,读时加载

实现写时复制&#xff0c;读时加载&#xff0c;原理为&#xff0c;申请内存时&#xff0c;只给一段线性地址空间&#xff0c;并不分配物理内存&#xff0c;当cpu读、写该内存时&#xff0c;发生缺页中&#xff0c;或者写错误&#xff0c;中断处理程序根据前面设置的内容&#x…...

Python和R基因组及蛋白质组学和代谢组学

&#x1f335;Python片段 1. 数据处理与清理 基因组病理学的数据通常非常庞大&#xff0c;且可能包括 DNA 或 RNA 测序结果、基因表达数据等。Python 提供了高效的数据处理工具。 工具和库 Pandas: 用于加载、清理和操作数据。Numpy: 用于高效的数值计算。Dask: 用于大规模数…...

selenium环境搭建详细过程

一、准备工作 在开始搭建 Selenium 环境之前&#xff0c;确保具备以下条件&#xff1a; 1.稳定的网络连接&#xff1a; 以便能够下载所需的软件和驱动程序。 2.操作系统基础&#xff1a; 对您的操作系统&#xff08;如 Windows、Mac 或 Linux&#xff09;有基本的了解和操…...

Linux知识 - VIM

VI于VIM linux系统里边内置了一个编辑器就叫做vi&#xff08;visual editor&#xff09;&#xff0c;但vi的功能非常有限&#xff0c;所以一般Linux的使用人员会选择一个比vi更强大的编辑器vim Vim的三种工作模式 输入模式 在正常模式中按下别字母键&#xff0c;会进入插入模式…...

【数据结构】链表重难点突破

目录 一、链表的概念 二、链表的实现 2.1 链表的构建 2.2 从链表头部添加元素 2.3 从链表尾部添加元素 2.4 链表任意位置添加元素 2.5 常规方法实现 2.6 获取指定位置的元素 2.7 获取指定元素的位置 2.8 修改链表中某一节点 2.9 删除链表的头结点 2.10 删除链表的尾…...

大宗商品行业区块链应用

应用场景 区块链技术具有透明性、去中心化、不可篡改等特点&#xff0c;因此可以在大宗商品定价方面得到应用。通过区块链技术&#xff0c;相关交易的各方可以在无需依赖中心化第三方的情况下&#xff0c;实时、准确地获取定价信息。这种技术的应用能够提高效率、降低成本、提…...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下&#xff0c;商品详情API作为连接电商平台与开发者、商家及用户的关键纽带&#xff0c;其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息&#xff08;如名称、价格、库存等&#xff09;的获取与展示&#xff0c;已难以满足市场对个性化、智能…...

MVC 数据库

MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

SpringTask-03.入门案例

一.入门案例 启动类&#xff1a; package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

基于 TAPD 进行项目管理

起因 自己写了个小工具&#xff0c;仓库用的Github。之前在用markdown进行需求管理&#xff0c;现在随着功能的增加&#xff0c;感觉有点难以管理了&#xff0c;所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD&#xff0c;需要提供一个企业名新建一个项目&#…...

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生&#xff0c;小白用户&#xff0c;想学习知识的 有点基础&#xff0c;想要通过项…...

LRU 缓存机制详解与实现(Java版) + 力扣解决

&#x1f4cc; LRU 缓存机制详解与实现&#xff08;Java版&#xff09; 一、&#x1f4d6; 问题背景 在日常开发中&#xff0c;我们经常会使用 缓存&#xff08;Cache&#xff09; 来提升性能。但由于内存有限&#xff0c;缓存不可能无限增长&#xff0c;于是需要策略决定&am…...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storms…...