W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
我們看到的所有依賴項(xiàng)都是一個(gè)固定的函數(shù)或類。
但是在某些情況下,您希望能夠在依賴項(xiàng)上設(shè)置參數(shù),而不必聲明許多不同的函數(shù)或類。
假設(shè)我們想要一個(gè)依賴項(xiàng)來檢查查詢參數(shù)是否q包含某些固定內(nèi)容。
但是我們希望能夠參數(shù)化該固定內(nèi)容。
在 Python 中,有一種方法可以使類的實(shí)例成為“可調(diào)用的”。
不是類本身(已經(jīng)是可調(diào)用的),而是該類的實(shí)例。
為此,我們聲明了一個(gè)方法__call__:
from fastapi import Depends, FastAPI
app = FastAPI()
class FixedContentQueryChecker:
def __init__(self, fixed_content: str):
self.fixed_content = fixed_content
def __call__(self, q: str = ""):
if q:
return self.fixed_content in q
return False
checker = FixedContentQueryChecker("bar")
@app.get("/query-checker/")
async def read_query_check(fixed_content_included: bool = Depends(checker)):
return {"fixed_content_in_query": fixed_content_included}
在這種情況下,這__call__就是FastAPI將用于檢查附加參數(shù)和子依賴項(xiàng)的內(nèi)容,并且稍后將調(diào)用此內(nèi)容將值傳遞給您的路徑操作函數(shù)中的參數(shù)。
現(xiàn)在,我們可以使用__init__來聲明我們可以用來“參數(shù)化”依賴項(xiàng)的實(shí)例的參數(shù):
from fastapi import Depends, FastAPI
app = FastAPI()
class FixedContentQueryChecker:
def __init__(self, fixed_content: str):
self.fixed_content = fixed_content
def __call__(self, q: str = ""):
if q:
return self.fixed_content in q
return False
checker = FixedContentQueryChecker("bar")
@app.get("/query-checker/")
async def read_query_check(fixed_content_included: bool = Depends(checker)):
return {"fixed_content_in_query": fixed_content_included}
在這種情況下,F(xiàn)astAPI永遠(yuǎn)不會(huì)觸及或關(guān)心__init__,我們將直接在我們的代碼中使用它。
我們可以使用以下命令創(chuàng)建此類的實(shí)例:
from fastapi import Depends, FastAPI
app = FastAPI()
class FixedContentQueryChecker:
def __init__(self, fixed_content: str):
self.fixed_content = fixed_content
def __call__(self, q: str = ""):
if q:
return self.fixed_content in q
return False
checker = FixedContentQueryChecker("bar")
@app.get("/query-checker/")
async def read_query_check(fixed_content_included: bool = Depends(checker)):
return {"fixed_content_in_query": fixed_content_included}
這樣我們就可以“參數(shù)化”我們的依賴項(xiàng),現(xiàn)在"bar"在它內(nèi)部,作為屬性checker.fixed_content。
然后,我們可以checker在Depends(checker), 而不是 中使用 this Depends(FixedContentQueryChecker),因?yàn)橐蕾図?xiàng)是實(shí)例checker,而不是類本身。
在解決依賴時(shí),F(xiàn)astAPI會(huì)這樣調(diào)用checker:
checker(q="somequery")
...并將在我們的路徑操作函數(shù)中作為依賴值返回的任何內(nèi)容作為參數(shù)傳遞fixed_content_included:
from fastapi import Depends, FastAPI
app = FastAPI()
class FixedContentQueryChecker:
def __init__(self, fixed_content: str):
self.fixed_content = fixed_content
def __call__(self, q: str = ""):
if q:
return self.fixed_content in q
return False
checker = FixedContentQueryChecker("bar")
@app.get("/query-checker/")
async def read_query_check(fixed_content_included: bool = Depends(checker)):
return {"fixed_content_in_query": fixed_content_included}
提示
這一切似乎都是人為的??赡苓€不是很清楚它有什么用處。
這些示例故意簡(jiǎn)單,但展示了它是如何工作的。
在有關(guān)安全性的章節(jié)中,有以相同方式實(shí)現(xiàn)的實(shí)用程序函數(shù)。
如果您理解了所有這些,您就已經(jīng)知道這些用于安全性的實(shí)用工具在底層是如何工作的。
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)系方式:
更多建議: