Movatterモバイル変換


[0]ホーム

URL:


跳转至
Join theFastAPI Cloud waiting list 🚀
Follow@fastapi onX (Twitter) to stay updated
FollowFastAPI onLinkedIn to stay updated
Subscribe to theFastAPI and friends newsletter 🎉
sponsor
sponsor
sponsor
sponsor
sponsor
sponsor
sponsor
sponsor
sponsor
sponsor
sponsor

子依赖项

🌐 由 AI 与人类协作翻译

本翻译由人类引导的 AI 生成。🤝

可能存在误解原意或不够自然等问题。🤖

你可以通过帮助我们更好地引导 AI LLM来改进此翻译。

英文版本

FastAPI 支持创建含子依赖项的依赖项。

并且,可以按需声明任意深度的子依赖项嵌套层级。

FastAPI 负责处理解析不同深度的子依赖项。

第一层依赖项 “dependable”

你可以创建一个第一层依赖项(“dependable”),如下:

fromtypingimportAnnotatedfromfastapiimportCookie,Depends,FastAPIapp=FastAPI()defquery_extractor(q:str|None=None):returnqdefquery_or_cookie_extractor(q:Annotated[str,Depends(query_extractor)],last_query:Annotated[str|None,Cookie()]=None,):ifnotq:returnlast_queryreturnq@app.get("/items/")asyncdefread_query(query_or_default:Annotated[str,Depends(query_or_cookie_extractor)],):return{"q_or_cookie":query_or_default}
🤓 Other versions and variants

Tip

Prefer to use theAnnotated version if possible.

fromfastapiimportCookie,Depends,FastAPIapp=FastAPI()defquery_extractor(q:str|None=None):returnqdefquery_or_cookie_extractor(q:str=Depends(query_extractor),last_query:str|None=Cookie(default=None)):ifnotq:returnlast_queryreturnq@app.get("/items/")asyncdefread_query(query_or_default:str=Depends(query_or_cookie_extractor)):return{"q_or_cookie":query_or_default}

这段代码声明了类型为str 的可选查询参数q,然后返回这个查询参数。

这个函数很简单(不过也没什么用),但却有助于让我们专注于了解子依赖项的工作方式。

第二层依赖项,“dependable”和“dependant”

接下来,创建另一个依赖项函数(一个“dependable”),并同时为它自身再声明一个依赖项(因此它同时也是一个“dependant”):

fromtypingimportAnnotatedfromfastapiimportCookie,Depends,FastAPIapp=FastAPI()defquery_extractor(q:str|None=None):returnqdefquery_or_cookie_extractor(q:Annotated[str,Depends(query_extractor)],last_query:Annotated[str|None,Cookie()]=None,):ifnotq:returnlast_queryreturnq@app.get("/items/")asyncdefread_query(query_or_default:Annotated[str,Depends(query_or_cookie_extractor)],):return{"q_or_cookie":query_or_default}
🤓 Other versions and variants

Tip

Prefer to use theAnnotated version if possible.

fromfastapiimportCookie,Depends,FastAPIapp=FastAPI()defquery_extractor(q:str|None=None):returnqdefquery_or_cookie_extractor(q:str=Depends(query_extractor),last_query:str|None=Cookie(default=None)):ifnotq:returnlast_queryreturnq@app.get("/items/")asyncdefread_query(query_or_default:str=Depends(query_or_cookie_extractor)):return{"q_or_cookie":query_or_default}

这里重点说明一下声明的参数:

  • 尽管该函数自身是依赖项(“dependable”),但还声明了另一个依赖项(它“依赖”于其他对象)
    • 该函数依赖query_extractor, 并把query_extractor 的返回值赋给参数q
  • 同时,该函数还声明了类型是str 的可选 cookie(last_query
    • 用户未提供查询参数q 时,则使用上次使用后保存在 cookie 中的查询

使用依赖项

接下来,就可以使用依赖项:

fromtypingimportAnnotatedfromfastapiimportCookie,Depends,FastAPIapp=FastAPI()defquery_extractor(q:str|None=None):returnqdefquery_or_cookie_extractor(q:Annotated[str,Depends(query_extractor)],last_query:Annotated[str|None,Cookie()]=None,):ifnotq:returnlast_queryreturnq@app.get("/items/")asyncdefread_query(query_or_default:Annotated[str,Depends(query_or_cookie_extractor)],):return{"q_or_cookie":query_or_default}
🤓 Other versions and variants

Tip

Prefer to use theAnnotated version if possible.

fromfastapiimportCookie,Depends,FastAPIapp=FastAPI()defquery_extractor(q:str|None=None):returnqdefquery_or_cookie_extractor(q:str=Depends(query_extractor),last_query:str|None=Cookie(default=None)):ifnotq:returnlast_queryreturnq@app.get("/items/")asyncdefread_query(query_or_default:str=Depends(query_or_cookie_extractor)):return{"q_or_cookie":query_or_default}

信息

注意,这里在路径操作函数中只声明了一个依赖项,即query_or_cookie_extractor

FastAPI 必须先处理query_extractor,以便在调用query_or_cookie_extractor 时使用query_extractor 返回的结果。

graph TBquery_extractor(["query_extractor"])query_or_cookie_extractor(["query_or_cookie_extractor"])read_query["/items/"]query_extractor --> query_or_cookie_extractor --> read_query

多次使用同一个依赖项

如果在同一个路径操作 多次声明了同一个依赖项,例如,多个依赖项共用一个子依赖项,FastAPI 在处理同一请求时,只调用一次该子依赖项。

FastAPI 不会为同一个请求多次调用同一个依赖项,而是把依赖项的返回值进行「缓存」,并把它传递给同一请求中所有需要使用该返回值的「依赖项」。

在高级使用场景中,如果不想使用「缓存」值,而是为需要在同一请求的每一步操作(多次)中都实际调用依赖项,可以把Depends 的参数use_cache 的值设置为False:

asyncdefneedy_dependency(fresh_value:Annotated[str,Depends(get_value,use_cache=False)]):return{"fresh_value":fresh_value}

提示

尽可能优先使用Annotated 版本。

asyncdefneedy_dependency(fresh_value:str=Depends(get_value,use_cache=False)):return{"fresh_value":fresh_value}

小结

千万别被本章里这些花里胡哨的词藻吓倒了,其实依赖注入系统非常简单。

依赖注入无非是与路径操作函数一样的函数罢了。

但它依然非常强大,能够声明任意嵌套深度的「图」或树状的依赖结构。

提示

这些简单的例子现在看上去虽然没有什么实用价值,

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

以及这些例子所能节省的代码量。


[8]ページ先頭

©2009-2026 Movatter.jp