FastAPI 的路由介绍及使用

标签: fastapi 路由 | 发表时间:2023-04-03 16:54 | 作者:宇宙之一粟
出处:https://juejin.cn/backend

theme: juejin

上一篇文章中,我介绍了 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 应用实例中,以实现所定义的路径操作的使用。希望本文能对你有作用,咱们下一篇文章再见!

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

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

本文正在参加 「金石计划」

参考链接:

相关 [fastapi 路由] 推荐:

FastAPI 的路由介绍及使用

- - 掘金 后端
上一篇文章中,我介绍了 FastAPI 框架的安装和 HelloWorld 项目搭建方式. 本文将介绍如何使用 Router 路由处理 FastAPI 中的请求. 路由 Router 就像是一个流水线上的线长,协调生产,下达命令给不同的组长进行分工,然后执行基本的任务. 路由器的工作目的是,在团队中工作时,您可能必须在团队成员(这里的团队负责人是队长)之间分配复杂性,这将有助于更快地完成项目,正确的 SME 将在该分支/路由器上工作..

浅谈路由表

- hama - 生活点滴
还是按照我自己的风格,用比较通俗的语言来介绍一下路由表知识. 只要通信就涉及到数据的交换,比如传统的信件,都是通过邮局来进行邮递运输的,那么同样,ip设备之间的通信,也一样需要数据交换,也需要通过“邮递员”来进行投递. 这个时候就需要一种规则,这个规则就是路由表. 下面我们来看看本机的路由表,在windows开始菜单->运行->cmd,然后在弹出的命令行中输入route print即可看到本机的路由表.

Linux中添加路由

- - Linux - 操作系统 - ITeye博客
在文件/etc/init.d/network中可以看到如下部分内容. 可见只要在/etc/sysconfig/static-routes中添加路由信息即可(若该文件不存在新建即可),添加信息如下. 然后重启网络服务,即执行如下命令:. 最后查看添加结果,命令是:. 先配置ip地址及子网掩码,勿配置网关,如下.

OpenWrt路由器开发

- - SegmentFault 最新的文章
第一次尝试开发路由器,发现并不是想象中那么难,和普通嵌入式开发一样,也是一块ARM板刷上Linux系统. OpenWrt有很多好用的软件,附带流量监测. OpenWrt主要开发语言为Python、Lua、Shell,还可以做深入研究写ipk软件包. 写了几个脚本,主要实现了openwrt下面GPIO控制、系统信息获取、wifi扫描器、定时发送邮件系统报警等功能,下面会介绍.

Elasticsearch的路由(Routing)特性

- - 企业架构 - ITeye博客
Elasticsearch路由机制介绍. Elasticsearch的路由机制与其分片机制有着直接的关系. Elasticsearch的路由机制即是通过哈希算法,将具有相同哈希值的文档放置到同一个主分片中. 这个和通过哈希算法来进行负载均衡几乎是一样的. 而Elasticsearch也有一个默认的路由算法:它会将文档的ID值作为依据将其哈希到相应的主分片上,这种算法基本上会保持所有数据在所有分片上的一个平均分布,而不会产生数据热点.

vue路由权限校验

- - 掘金前端
做后台系统的时候,难免会有用户权限的判断. admin可以查看全部菜单,user只能查看部分菜单. 一开始接触这个需求的时候,完全是纯前端做的. 在配置路由的时候,加一个roles的属性,通过判断用户的roles是否与路由的roles属性相匹配来作为显示隐藏的依据. // 过滤路由 menuList-菜单 roles-用户角色 const checkMenuList = (menuList, roles) => { for (let i = 0; i < menuList.length; i++) {.

软件路由器破速度记录

- flypen - 弯曲评论
韩国的研究人员们建立了一个由端台式电脑组件组成的网络路由器,可以以创记录的速度传输数据. 来自韩国高等科技研究院的团队创造的这款路由器,传输数据的 速度是每秒40千兆比特(gigabits ),比类似装置的前纪录快出许多倍. 研究人员们使用的技术可能会带来很多方面的突破,包括在高性能路由器中使用廉价的芯片——如英特尔和Nvidia制造 的——以代替定制的硬件.

有线+无线路由器设置

- - 博客园_iTech's Blog
有线路由器已经连接外网,新购买了无线路由器来扩充网络接口,且支持无线. 路由器的默认地址有可能为192.168.0.1 或者 192.168.1.1,用户名和密码也一般为admin:admin或admin+空. 以下假设有线路由器的IP为192.168.0.1. 有线路由器LAN口出来的网线连接无线路由器的WAN口,计算机再通过无线网络配置进行上网,无线路由器起到路由器的功能.

交换机和路由器的区别

- - CSDN博客互联网推荐文章
       交换机,又叫做交换式集线器,可以简单的理解为把一些电脑连接在一起组成一个局域网. 而路由器和交换机的区别很明显,它的作用在于连接不同的网段并且找到网络中数据传输最合适的路径,但二者也并不是完全无联系的. 下面来为大家解释交换机和路由器的区别. 路由器和交换机的区别一:交换机是一根网线上网,但是大家上网是分别拨号,各自使用自己的宽带,大家上网没有影响.

OpenWRT 路由系统上抓包

- - CSDN博客研发管理推荐文章
做路由器开发,难免会遇到抓包的情况,但是抓包需要有Hub或者无线抓包网卡,调试无线问题,且目前手中没有无线抓包网卡,怎么办. 那不能分析无线连接建立的过程,我们就来分析下,其传输的数据,肯定是从ra0无线接口来进行了. 编译tcpdump.ipk, libpcap.ipk并且安装到OpenWRT系统中.