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