W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
FastAPI 支持創(chuàng)建含子依賴項(xiàng)的依賴項(xiàng)。
并且,可以按需聲明任意深度的子依賴項(xiàng)嵌套層級(jí)。
FastAPI 負(fù)責(zé)處理解析不同深度的子依賴項(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)的工作方式。
接下來,創(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ù):
接下來,就可以使用依賴項(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é)果。
如果在同一個(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}
千萬別被本章里這些花里胡哨的詞藻嚇倒了,其實(shí)依賴注入系統(tǒng)非常簡單。
依賴注入無非是與路徑操作函數(shù)一樣的函數(shù)罷了。
但它依然非常強(qiáng)大,能夠聲明任意嵌套深度的「圖」或樹狀的依賴結(jié)構(gòu)。
提示
這些簡單的例子現(xiàn)在看上去雖然沒有什么實(shí)用價(jià)值,
但在安全一章中,您會(huì)了解到這些例子的用途,
以及這些例子所能節(jié)省的代碼量。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: