上一篇文章中,我介紹了 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
應用例項中,以實現所定義的路徑操作的使用。希望本文能對你有作用,我們們下一篇文章再見!
希望本文能對你有所幫助,如果喜歡本文,可以點個關注.
下一篇文章見!宇宙古今無有窮期,一生不過須臾,當思奮爭。
參考連結: