FastAPI教程 子依賴項(xiàng)

2021-11-02 17:05 更新

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

并且,可以按需聲明任意深度的子依賴項(xiàng)嵌套層級(jí)。

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

第一層依賴項(xiàng)

下列代碼創(chuàng)建了第一層依賴項(xià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,然后返回這個(gè)查詢參數(shù)。

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

第二層依賴項(xiàng)

接下來,創(chuàng)建另一個(gè)依賴項(xiàng)函數(shù),并同時(shí)用該依賴項(xiàng)自身再聲明一個(gè)依賴項(xiàng)(所以這也是一個(gè)「依賴項(xià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}

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

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

使用依賴項(xiàng)

接下來,就可以使用依賴項(xià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}

信息

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

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

Syntax error in graphmermaid version 8.8.4

多次使用同一個(gè)依賴項(xiàng)

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

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

在高級(jí)使用場景中,如果不想使用「緩存」值,而是為需要在同一請求的每一步操作(多次)中都實(shí)際調(diào)用依賴項(xiàng),可以把 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é)

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

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

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

提示

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

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

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


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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)