FastAPI教程 依賴項 - 第一步

2021-11-02 17:01 更新

FastAPI 提供了簡單易用,但功能強大的依賴注入系統(tǒng)。

這個依賴系統(tǒng)設(shè)計的簡單易用,可以讓開發(fā)人員輕松地把組件集成至 FastAPI。

什么是「依賴注入」

編程中的「依賴注入」是聲明代碼(本文中為路徑操作函數(shù) )運行所需的,或要使用的「依賴」的一種方式。

然后,由系統(tǒng)(本文中為 FastAPI)負責執(zhí)行任意需要的邏輯,為代碼提供這些依賴(「注入」依賴項)。

依賴注入常用于以下場景:

  • 共享業(yè)務(wù)邏輯(復(fù)用相同的代碼邏輯)
  • 共享數(shù)據(jù)庫連接
  • 實現(xiàn)安全、驗證、角色權(quán)限
  • 等……

上述場景均可以使用依賴注入,將代碼重復(fù)最小化。

第一步

接下來,我們學習一個非常簡單的例子,盡管它過于簡單,不是很實用。

但通過這個例子,您可以初步了解「依賴注入」的工作機制。

創(chuàng)建依賴項

首先,要關(guān)注的是依賴項。

依賴項就是一個函數(shù),且可以使用與路徑操作函數(shù)相同的參數(shù):

from typing import Optional

from fastapi import Depends, FastAPI

app = FastAPI()


async def common_parameters(q: Optional[str] = None, skip: int = 0, limit: int = 100):
    return {"q": q, "skip": skip, "limit": limit}


@app.get("/items/")
async def read_items(commons: dict = Depends(common_parameters)):
    return commons


@app.get("/users/")
async def read_users(commons: dict = Depends(common_parameters)):
    return commons

大功告成。

只用了2 行代碼。

依賴項函數(shù)的形式和結(jié)構(gòu)與路徑操作函數(shù)一樣。

因此,可以把依賴項當作沒有「裝飾器」(即,沒有 @app.get("/some-path") )的路徑操作函數(shù)。

依賴項可以返回各種內(nèi)容。

本例中的依賴項預(yù)期接收如下參數(shù):

  • 類型為 str 的可選查詢參數(shù) q
  • 類型為 int 的可選查詢參數(shù) skip,默認值是 0
  • 類型為 int 的可選查詢參數(shù) limit,默認值是 100

然后,依賴項函數(shù)返回包含這些值的 dict。

導(dǎo)入 Depends

from typing import Optional

from fastapi import Depends, FastAPI

app = FastAPI()


async def common_parameters(q: Optional[str] = None, skip: int = 0, limit: int = 100):
    return {"q": q, "skip": skip, "limit": limit}


@app.get("/items/")
async def read_items(commons: dict = Depends(common_parameters)):
    return commons


@app.get("/users/")
async def read_users(commons: dict = Depends(common_parameters)):
    return commons

聲明依賴項

與在路徑操作函數(shù)參數(shù)中使用 Body、Query 的方式相同,聲明依賴項需要使用 Depends 和一個新的參數(shù):

from typing import Optional

from fastapi import Depends, FastAPI

app = FastAPI()


async def common_parameters(q: Optional[str] = None, skip: int = 0, limit: int = 100):
    return {"q": q, "skip": skip, "limit": limit}


@app.get("/items/")
async def read_items(commons: dict = Depends(common_parameters)):
    return commons


@app.get("/users/")
async def read_users(commons: dict = Depends(common_parameters)):
    return commons

雖然,在路徑操作函數(shù)的參數(shù)中使用 Depends 的方式與 Body、Query 相同,但 Depends 的工作方式略有不同。

這里只能傳給 Depends 一個參數(shù)。

且該參數(shù)必須是可調(diào)用對象,比如函數(shù)。

該函數(shù)接收的參數(shù)和路徑操作函數(shù)的參數(shù)一樣。

提示

下一章介紹,除了函數(shù)還有哪些「對象」可以用作依賴項。

接收到新的請求時,F(xiàn)astAPI 執(zhí)行如下操作:

  • 用正確的參數(shù)調(diào)用依賴項函數(shù)(「可依賴項」)
  • 獲取函數(shù)返回的結(jié)果
  • 把函數(shù)返回的結(jié)果賦值給路徑操作函數(shù)的參數(shù)


這樣,只編寫一次代碼,F(xiàn)astAPI 就可以為多個路徑操作共享這段代碼 。

檢查

注意,無需創(chuàng)建專門的類,并將之傳遞給 FastAPI 以進行「注冊」或執(zhí)行類似的操作。

只要把它傳遞給 Depends,F(xiàn)astAPI 就知道該如何執(zhí)行后續(xù)操作。

要不要使用 async?

FastAPI 調(diào)用依賴項的方式與路徑操作函數(shù)一樣,因此,定義依賴項函數(shù),也要應(yīng)用與路徑操作函數(shù)相同的規(guī)則。

即,既可以使用異步的 async def,也可以使用普通的 def 定義依賴項。

在普通的 def 路徑操作函數(shù)中,可以聲明異步的 async def 依賴項;也可以在異步的 async def 路徑操作函數(shù)中聲明普通的 def 依賴項。

上述這些操作都是可行的,F(xiàn)astAPI 知道該怎么處理。

筆記

如里不了解異步,請參閱異步:“著急了?” 一章中 async 和 await 的內(nèi)容。

與 OpenAPI 集成

依賴項及子依賴項的所有請求聲明、驗證和需求都可以集成至同一個 OpenAPI 概圖。

所以,交互文檔里也會顯示依賴項的所有信息:

簡單用法

觀察一下就會發(fā)現(xiàn),只要路徑 和操作匹配,就可以使用聲明的路徑操作函數(shù)。然后,F(xiàn)astAPI 會用正確的參數(shù)調(diào)用函數(shù),并提取請求中的數(shù)據(jù)。

實際上,所有(或大多數(shù))網(wǎng)絡(luò)框架的工作方式都是這樣的。

開發(fā)人員永遠都不需要直接調(diào)用這些函數(shù),這些函數(shù)是由框架(在此為 FastAPI )調(diào)用的。

通過依賴注入系統(tǒng),只要告訴 FastAPI 路徑操作函數(shù) 還要「依賴」其他在路徑操作函數(shù)之前執(zhí)行的內(nèi)容,F(xiàn)astAPI 就會執(zhí)行函數(shù)代碼,并「注入」函數(shù)返回的結(jié)果。

其他與「依賴注入」概念相同的術(shù)語為:

  • 資源(Resource)
  • 提供方(Provider)
  • 服務(wù)(Service)
  • 可注入(Injectable)
  • 組件(Component)

FastAPI 插件

依賴注入系統(tǒng)支持構(gòu)建集成和「插件」。但實際上,F(xiàn)astAPI 根本不需要創(chuàng)建「插件」,因為使用依賴項可以聲明不限數(shù)量的、可用于路徑操作函數(shù)的集成與交互。

創(chuàng)建依賴項非常簡單、直觀,并且還支持導(dǎo)入 Python 包。毫不夸張地說,只要幾行代碼就可以把需要的 Python 包與 API 函數(shù)集成在一起。

下一章將詳細介紹在關(guān)系型數(shù)據(jù)庫、NoSQL 數(shù)據(jù)庫、安全等方面使用依賴項的例子。

FastAPI 兼容性

依賴注入系統(tǒng)如此簡潔的特性,讓 FastAPI 可以與下列系統(tǒng)兼容:

  • 關(guān)系型數(shù)據(jù)庫
  • NoSQL 數(shù)據(jù)庫
  • 外部支持庫
  • 外部 API
  • 認證和鑒權(quán)系統(tǒng)
  • API 使用監(jiān)控系統(tǒng)
  • 響應(yīng)數(shù)據(jù)注入系統(tǒng)
  • 等等……

簡單而強大

雖然,層級式依賴注入系統(tǒng)的定義與使用十分簡單,但它卻非常強大。

比如,可以定義依賴其他依賴項的依賴項。

最后,依賴項層級樹構(gòu)建后,依賴注入系統(tǒng)會處理所有依賴項及其子依賴項,并為每一步操作提供(注入)結(jié)果。

比如,下面有 4 個 API 路徑操作(端點):

  • /items/public/
  • /items/private/
  • /users/{user_id}/activate
  • /items/pro/

開發(fā)人員可以使用依賴項及其子依賴項為這些路徑操作添加不同的權(quán)限:


與 OpenAPI 集成

在聲明需求時,所有這些依賴項還會把參數(shù)、驗證等功能添加至路徑操作。

FastAPI 負責把上述內(nèi)容全部添加到 OpenAPI 概圖,并顯示在交互文檔中。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號