FastAPI教程 子依賴項

2021-11-02 17:05 更新

FastAPI 支持創(chuàng)建含子依賴項的依賴項。

并且,可以按需聲明任意深度的子依賴項嵌套層級。

FastAPI 負(fù)責(zé)處理解析不同深度的子依賴項。

第一層依賴項

下列代碼創(chuàng)建了第一層依賴項:

from typing import Optional

from fastapi import Cookie, Depends, FastAPI

app = FastAPI()


def query_extractor(q: Optional[str] = None):
    return q


def query_or_cookie_extractor(
    q: str = Depends(query_extractor), last_query: Optional[str] = Cookie(None)
):
    if not q:
        return last_query
    return q


@app.get("/items/")
async def read_query(query_or_default: str = Depends(query_or_cookie_extractor)):
    return {"q_or_cookie": query_or_default}

這段代碼聲明了類型為 str 的可選查詢參數(shù) q,然后返回這個查詢參數(shù)。

這個函數(shù)很簡單(不過也沒什么用),但卻有助于讓我們專注于了解子依賴項的工作方式。

第二層依賴項

接下來,創(chuàng)建另一個依賴項函數(shù),并同時用該依賴項自身再聲明一個依賴項(所以這也是一個「依賴項」):

from typing import Optional

from fastapi import Cookie, Depends, FastAPI

app = FastAPI()


def query_extractor(q: Optional[str] = None):
    return q


def query_or_cookie_extractor(
    q: str = Depends(query_extractor), last_query: Optional[str] = Cookie(None)
):
    if not q:
        return last_query
    return q


@app.get("/items/")
async def read_query(query_or_default: str = Depends(query_or_cookie_extractor)):
    return {"q_or_cookie": query_or_default}

這里重點說明一下聲明的參數(shù):

  • 盡管該函數(shù)自身是依賴項,但還聲明了另一個依賴項(它「依賴」于其他對象)該函數(shù)依賴 query_extractor, 并把 query_extractor 的返回值賦給參數(shù) q
  • 同時,該函數(shù)還聲明了類型是 str 的可選 cookie(last_query)用戶未提供查詢參數(shù) q 時,則使用上次使用后保存在 cookie 中的查詢

使用依賴項

接下來,就可以使用依賴項:

from typing import Optional

from fastapi import Cookie, Depends, FastAPI

app = FastAPI()


def query_extractor(q: Optional[str] = None):
    return q


def query_or_cookie_extractor(
    q: str = Depends(query_extractor), last_query: Optional[str] = Cookie(None)
):
    if not q:
        return last_query
    return q


@app.get("/items/")
async def read_query(query_or_default: str = Depends(query_or_cookie_extractor)):
    return {"q_or_cookie": query_or_default}

信息

注意,這里在路徑操作函數(shù)中只聲明了一個依賴項,即 query_or_cookie_extractor 。

但 FastAPI 必須先處理 query_extractor,以便在調(diào)用 query_or_cookie_extractor 時使用 query_extractor 返回的結(jié)果。

Syntax error in graphmermaid version 8.8.4

多次使用同一個依賴項

如果在同一個路徑操作 多次聲明了同一個依賴項,例如,多個依賴項共用一個子依賴項,F(xiàn)astAPI 在處理同一請求時,只調(diào)用一次該子依賴項。

FastAPI 不會為同一個請求多次調(diào)用同一個依賴項,而是把依賴項的返回值進(jìn)行「緩存」,并把它傳遞給同一請求中所有需要使用該返回值的「依賴項」。

在高級使用場景中,如果不想使用「緩存」值,而是為需要在同一請求的每一步操作(多次)中都實際調(diào)用依賴項,可以把 Depends 的參數(shù) use_cache 的值設(shè)置為 False :

async def needy_dependency(fresh_value: str = Depends(get_value, use_cache=False)):
    return {"fresh_value": fresh_value}

小結(jié)

千萬別被本章里這些花里胡哨的詞藻嚇倒了,其實依賴注入系統(tǒng)非常簡單。

依賴注入無非是與路徑操作函數(shù)一樣的函數(shù)罷了。

但它依然非常強大,能夠聲明任意嵌套深度的「圖」或樹狀的依賴結(jié)構(gòu)。

提示

這些簡單的例子現(xiàn)在看上去雖然沒有什么實用價值,

但在安全一章中,您會了解到這些例子的用途,

以及這些例子所能節(jié)省的代碼量。


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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號