写点什么

FastAPI 的路由介绍与使用

作者:宇宙之一粟
  • 2023-04-03
    中国香港
  • 本文字数:2751 字

    阅读完需:约 9 分钟

FastAPI 的路由介绍与使用

上一篇文章中,我介绍了 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  Speed100    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 routerrouter = APIRouter( prefix='/add', tags = ['addition'])
复制代码


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

  • prefix:在特定页面中 fastapi 提供的每个装饰器中添加前缀

  • tags:这将帮助我们找到属于哪个类别的功能(想想我们可以找到相关文章的主题标签)


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

from fastapi import APIRouter
# create routerrouter = 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 8888INFO:     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 StatReloadINFO:     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  Speed100    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 应用实例中,以实现所定义的路径操作的使用。希望本文能对你有作用,咱们下一篇文章再见!


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

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


参考链接:

发布于: 23 小时前阅读数: 15
用户头像

宇宙古今无有穷期,一生不过须臾,当思奋争 2020-05-07 加入

🏆InfoQ写作平台-签约作者 🏆 混迹于江湖,江湖却没有我的影子 热爱技术,专注于后端全栈,轻易不换岗 拒绝内卷,工作于外企开发,弹性不加班 热衷分享,执着于阅读写作,佛系不水文 同名公众号:《宇宙之一粟》

评论

发布
暂无评论
FastAPI 的路由介绍与使用_Python_宇宙之一粟_InfoQ写作社区