FastAPI 的路由介绍及使用

news2025/1/8 18:38:09

上一篇文章中,我介绍了 FastAPI 框架的安装和 HelloWorld 项目搭建方式。本文将介绍如何使用 Router 路由处理 FastAPI 中的请求。

什么是路由

路由 Router 就像是一个流水线上的线长,协调生产,下达命令给不同的组长进行分工,然后执行基本的任务。路由器的工作目的是,在团队中工作时,您可能必须在团队成员(这里的团队负责人是队长)之间分配复杂性,这将有助于更快地完成项目,正确的 SME 将在该分支/路由器上工作.

路由器接口

路由是构建网络应用的一个重要部分。FastAPI 中的路由是灵活和方便的。路由是处理从客户端发送到服务器的 HTTP 请求的过程。HTTP 请求被发送到定义的路由,这些路由有定义的处理程序来处理请求和响应。这些处理程序被称为 Route Handler。

FastAPI 中的路由

参考 FastAPI 文档对路由器的介绍:如果你正在构建一个应用程序或一个 Web API,你很少会把所有东西都放在一个文件中。 FastAPI 提供了一个方便的工具来构建您的应用程序,同时保持所有的灵活性。

先来看一个例子:

from fastapi import FastAPI

app = FastAPI()

@app.get('/') 
async def welcome() -> dict:
    return { "message": "Welcome to my Page"}

uvicorn 工具指向 FastAPI 的实例,为应用程序服务:

uvicorn main:app --port 8888 --reload

访问

$ curl http://127.0.0.1:8888
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    32  100    32    0     0  11279      0 --:--:-- --:--:-- --:--:-- 16000{"message":"Welcome to ma Page"}

FastAPI()实例可用于路由操作,正如前面所见。然而,这种方法通常用于在路由过程中只能处理单一路径的应用程序。在使用 FastAPI() 实例创建一个执行独特功能的单独路由的情况下,应用程序将无法运行两个路由,因为 uvicorn 工具只能运行一个入口点。

如果有多个路由

让我们了解一下如何用代码来创建路由器,下面是我们的基本(非路由器)代码,在这里,我创建了一个例子:主页、添加数字页面和添加字符串页面。由于这是一个例子,我只取了两个父路径为 '/add/' 的函数,但在现实生活中,你可能会发现 20-30 个这样的函数,然后你将需要创建路由器,因为在一个文件中处理太多复杂的东西会变得很麻烦。

from fastapi import FastAPI


app = FastAPI()

@app.get('/') 
async def welcome() -> dict:
    return { "message": "Welcome to my Page"}

@app.get('/add/numbers')
def add_numbers():
    return { "message": "we are adding numbers"}

@app.get('/add/strings')
def add_strings():
    return { "message": "we are adding strings"}

那么,问题来了,我们如何处理需要一系列路由执行不同功能的广泛应用程序呢?答案是 APIRouter 类。

利用 APIRouter 类实现路由

APIRouter 类属于 FastAPI 包,为多个路由创建路径操作。APIRouter 类鼓励应用程序路由和逻辑的模块化和组织化。

APIRouter 类从 fastapi 包中导入,并创建一个实例。路由方法被创建并从创建的实例中分发,例如如下:

from fastapi import APIRouter

# create router
router = APIRouter(
    prefix='/add',
    tags = ['addition']
)

上面的代码将创建一个路由器实例,它可以带有一些参数,比如下面两个的含义:

  • prefix:在特定页面中 fastapi 提供的每个装饰器中添加前缀
  • tags:这将帮助我们找到属于哪个类别的功能(想想我们可以找到相关文章的主题标签)

然后可以利用 APIRouter 类创建一个新的路径操作,创建一个新文件 add_router.py

from fastapi import APIRouter

# create router
router = APIRouter(
    prefix='/add',
    tags = ['addition']
)


@router.get('/numbers')
def add_numbers():
    return { "message": "we are adding numbers"}

@router.get('/strings')
def add_strings():
    return { "message": "we are adding strings"}

APIRouter 类的工作方式与 FastAPI 类的工作方式相同。然而、 uvicorn 不能使用 APIRouter 实例为应用程序服务,这与 FastAPI 不同。使用 APIRouter 类定义的路由需要被添加到 FastAPI 实例中,以实现它们的功能。

为了使刚刚定义的路由可见,我们将使用 include_router() 方法把 add_router 路径操作处理程序到主 FastAPI 实例中,如下:

from fastapi import FastAPI

from src import add_router # importing router

app = FastAPI() # create an app instance



@app.get('/') 
async def welcome() -> dict:
    return { "message": "Welcome to my Page"}

app.include_router(add_router.router)

include_router(router, ...) 方法负责在主程序的实例中加入用 APIRouter 类定义的路由添加到主应用程序的实例中,以使路由变得可见。

最终的文件目录结构如下:

测试 Router 功能

启动我们的 uvicorn 服务:

uvicorn src.main:app --reload --port 8888

在控制台看到如下信息,表示服务启动成功:

$ uvicorn src.main:app --reload --port 8888
INFO:     Will watch for changes in these directories: ['C:\Users\Wade\Desktop\FastAPI\fastwebprojects']
INFO:     Uvicorn running on http://127.0.0.1:8888 (Press CTRL+C to quit)
INFO:     Started reloader process [23508] using StatReload
INFO:     Started server process [30600]
INFO:     Waiting for application startup.
INFO:     Application startup complete.

使用浏览器或者终端发送 GET 请求:

$ curl http://127.0.0.1:8888
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    32  100    32    0     0  12255      0 --:--:-- --:--:-- --:--:-- 16000{"message":"Welcome to my Page"}

浏览器如下,访问 http://127.0.0.1:8888/

访问 http://127.0.0.1:8888/add/numbers :

访问 http://127.0.0.1:8888/add/strings

最后,通过访问 http://127.0.0.1:8888/docs 来查看我们刚刚定义的接口,我们将看到自动 API 文档,包括来自所有子模块的路径,使用正确的路径(和前缀)和正确的标签名:

总结

我们已经学会了 FastAPI 中的 APIRouter 类是如何工作的,以及如何将其包含在 main 应用实例中,以实现所定义的路径操作的使用。希望本文能对你有作用,咱们下一篇文章再见!

希望本文能对你有所帮助,如果喜欢本文,可以点个关注.

下一篇文章见!宇宙古今无有穷期,一生不过须臾,当思奋争。

参考链接:

  • Bigger Applications - Multiple Files
  • Router API
  • Routers in FastAPI
  • FastAPI Error loading ASGI app. Could not import module ‘main’

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/536609.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Springboot——事物管理

文章目录 事务管理一、 Spring事务管理1.1 事务回顾1.2 案例: 解散部门(未开启事务)1.3 事务管理注解Transactional1.4 事务管理日志开关1.5 rollbackFor 异常回滚属性1.6 propagation 事务传播行为1.7 解散部门并记录操作日志1.7.1 创建数据…

Java 8 腰斩!Java 17 暴涨 430%!!(文末福利)

New Relic 最新发布了一份 “2023 年 Java 生态系统状况报告”,旨在提供有关当今 Java 生态系统状态的背景和见解。该报告基于从数百万个提供性能数据的应用程序中收集的数据,对生产中使用最多的版本、最受欢迎的 JDK 供应商、容器的兴起等多方面进行了调…

AIGC+实时云渲染:开启3D内容生态的黄金时代

AIGC技术革命下,我们的3D内容生态将会迎来怎样的变化格局? 实时云渲染 / Cloud XR技术将在AIGC大潮中扮演什么样的角色? 作为云基础设施厂商,我们有哪些机会可以抓住? 这些问题已在XR产业、3D内容行业以及软件行业内…

人工智能基础部分18-条件随机场CRF模型的应用

大家好,我是微学AI,今天给大家介绍一下人工智能基础部分18-条件随机场CRF模型的应用,本文将详细介绍条件随机场(CRF)模型,包括其原理、应用场景及实际代码实现。我将通过一个生活中的简单数据样例来演示如何输入数据、运行模型以及…

prometheus监控redis集群并显示到granfana面板

prometheus监控redis集群 监控redis1,在redis机器上安装redis_exporter2,配置prometheus配置文件3,设置redis maxmemory4,导入redis监控模板736 监控redis 1,在redis机器上安装redis_exporter 下载,安装r…

什么是边缘服务器?边缘计算的未来如何?

边缘服务器是指驻留在网络逻辑边缘上的任何类型的服务器,通常位于专用网络和互联网之间。边缘服务器的计算能力正在迅速塑造现代工业格局,动态应用程序和现代业务基础设施的出现使得数据的快速处理和共享成为必然。公司现在正在用边缘服务器技术取代传统…

什么是Pinia?以及它的使用方式?以及和Vuex的区别是什么?

文章目录 概要什么是Pinia?Pinia和Vuex的区别?Pinia相比于Vuex的优势?为什么要使用Pinia?Pinia的简单使用安装(仅限于Vue3)使用 概要 提示:下边是Pinia的简单介绍(详解请点击查看官方…

深度解析接口自动化框架封装项目:封装层级,关联调用,极限改进

目录 前言: 一、接口封装与封装层级 二、接口关联和数据准备 三、接口封装极限改进 四、代码示例 五、总结 前言: 接口自动化是软件测试领域中的一个重要环节,它可以自动化执行接口测试用例,快速发现和定位接口问题&#xf…

JAVA的基本数据类型及扩大缩小转换

JAVA的8种基本类型 分为四大类:整形、浮点型、字符型、布尔型 数据类型类别大小(位)范围byte整型8-128 到 127short整型16-32768 到 32767int整型32-2147483648 到 2147483647long整型64-9223372036854775808 到 9223372036854775807float浮点型32约3.40282347e38…

房屋装修选择自装,如何寻找砌墙工人,比价并施工(砌墙阶段)

环境: 地点:杭州 装修类型:自装 面积:建面135平方 进度:砌墙阶段 问题描述: 房屋装修选择自装,如何寻找砌墙工人,比价并施工 解决方案: 一、了解砌墙相关知识 砌…

docker 安装 prometheus,grafana,node-exporter 监控工具

:https://download.csdn.net/download/qq_42208305/87792827 加载离线镜像 : 监控端安装: docker load -i prometheus.tar docker load -i grafana.tar 被监控端安装: docker load -i node-expo…

类加载器与模块化系统

1 类加载器 “类加载器”是实现应用程序自己决定如何去获取所需的类这个动作的代码。 1.1 类与类加载器 比较两个类是否“相等”,只有在这两个类是由同一个类加载器加载的前提下才有意义。否则,即使这两个类来源同一个Class文件,被同一个J…

智慧型档案馆十防一体化安全管控平台所需要的主要产品

档案八防十防常用的十款设备 序号 名称 1 温湿度传感器 2 空气质量云测仪 3 恒湿净化一体机 4 健康防护一体机 5 综合智能触摸一体化区域控制器 6 空调红外学习控制模块 7 漏水检测控制器及感应线 8 数字烟雾传感器 9 红外防盗传感器 10 系统软件平台 附…

无脑006——mmrotate框架下复现RTMDet-R

必须用mmrotate才有hrsc的程序 1 安装环境: Linux RTX 3090 nvcc --version cuda 11.3 pytorch 1.11.0 conda install pytorch1.11.0 torchvision0.12.0 torchaudio0.11.0 cudatoolkit11.3 -c pytorch测试pytorch是否安装成功: >>> torch.…

深入浅出PyTorch数据读取机制

熟悉深度学习的小伙伴一定都知道:深度学习模型训练主要由数据、模型、损失函数、优化器以及迭代训练五个模块组成。如下图所示,Pytorch数据读取机制则是数据模块中的主要分支。 Pytorch数据读取是通过​​Dataset​​​​​Dataloader​​的方式完成。其…

SOME/IP中间件通信流程

本文根据文章《CAPL如何实现SOME/IP协议通信:SomeIP_IL.dll函数篇(超两万字详解)》内容,抽取总结出SOME/IP通信流程,正不正确的另说,目的是为了加深对SOME/IP中间件的理解。 首先,不管是消费方consumer,还是提供方provider,都有自己的someip中间件。本质上,它是一个…

vue3 cesium datav 可视化大屏

目录 0. 预览效果 1. 代码库包 2. 技术点 3. 一些注意事项(配置参数) 4. 相关代码详情 0. 预览效果 包含的功能: ① 地球按照一定速度自转 ② 修改加载的geojson面样式 ③ 添加 文字 标注! 1. 代码库包 直接采用vue-cli5 创建…

MySql从入门到精通

MySql介绍 MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。 什么是数据库 数据库(Database)是按照数据结构来组织、存储…

oracle 闪回恢复

oracle 闪回恢复 闪回恢复区主要通过3个初始化参数来设置和管理: db_recovery_file_dest:指定闪回恢复区的位置 db_recovery_file_dest_size:指定闪回恢复区的可用空间大小 db_flashback_retention_target:指定数据库可以回退的时…

年近30 ,无情被辞,想给划水的兄弟提个醒

前几天,一个认识了好几年在大厂工作的程序员朋友,年近30了,却被大厂以“人员优化”的名义无情被辞,据他说,有一个月散伙饭都吃了好几顿…… 在很多企业,都有KPI考核,然后在此基础上还会弄个“末…