FastAPI 的路由介紹與使用

宇宙之一粟發表於2023-04-10

上一篇文章中,我介紹了 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 應用例項中,以實現所定義的路徑操作的使用。希望本文能對你有作用,我們們下一篇文章再見!

希望本文能對你有所幫助,如果喜歡本文,可以點個關注.

下一篇文章見!宇宙古今無有窮期,一生不過須臾,當思奮爭。

參考連結:

相關文章