乐趣区

关于python: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  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’
退出移动版