Movatterモバイル変換


[0]ホーム

URL:


Saltar a contenido
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

Sub-dependencias

🌐 Traducción por IA y humanos

Esta traducción fue hecha por IA guiada por humanos. 🤝

Podría tener errores al interpretar el significado original, o sonar poco natural, etc. 🤖

Puedes mejorar esta traducciónayudándonos a guiar mejor al LLM de IA.

Versión en inglés

Puedes crear dependencias que tengansub-dependencias.

Pueden ser tanprofundas como necesites.

FastAPI se encargará de resolverlas.

Primera dependencia "dependable"

Podrías crear una primera dependencia ("dependable") así:

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}

Declara un parámetro de query opcionalq como unstr, y luego simplemente lo devuelve.

Esto es bastante simple (no muy útil), pero nos ayudará a centrarnos en cómo funcionan las sub-dependencias.

Segunda dependencia, "dependable" y "dependant"

Luego puedes crear otra función de dependencia (un "dependable") que al mismo tiempo declare una dependencia propia (por lo que también es un "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}

Centrémonos en los parámetros declarados:

  • Aunque esta función es una dependencia ("dependable") en sí misma, también declara otra dependencia (depende de algo más).
    • Depende delquery_extractor, y asigna el valor que devuelve al parámetroq.
  • También declara unalast_query cookie opcional, como unstr.
    • Si el usuario no proporcionó ningún queryq, usamos el último query utilizado, que guardamos previamente en una cookie.

Usa la dependencia

Entonces podemos usar la dependencia con:

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}

Información

Fíjate que solo estamos declarando una dependencia en lapath operation function,query_or_cookie_extractor.

PeroFastAPI sabrá que tiene que resolverquery_extractor primero, para pasar los resultados de eso aquery_or_cookie_extractor al llamarlo.

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

Usando la misma dependencia múltiples veces

Si una de tus dependencias se declara varias veces para la mismapath operation, por ejemplo, múltiples dependencias tienen una sub-dependencia común,FastAPI sabrá llamar a esa sub-dependencia solo una vez por request.

Y guardará el valor devuelto en un"caché" y lo pasará a todos los "dependants" que lo necesiten en ese request específico, en lugar de llamar a la dependencia varias veces para el mismo request.

En un escenario avanzado donde sabes que necesitas que la dependencia se llame en cada paso (posiblemente varias veces) en el mismo request en lugar de usar el valor "en caché", puedes establecer el parámetrouse_cache=False al usarDepends:

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

Consejo

Prefiere usar la versiónAnnotated si es posible.

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

Resumen

Aparte de todas las palabras rimbombantes usadas aquí, el sistema deInyección de Dependencias es bastante simple.

Solo son funciones que se ven igual que laspath operation functions.

Pero aun así, es muy potente y te permite declarar "grafos" de dependencia anidados arbitrariamente profundos (árboles).

Consejo

Todo esto podría no parecer tan útil con estos ejemplos simples.

Pero verás lo útil que es en los capítulos sobreseguridad.

Y también verás la cantidad de código que te ahorrará.


[8]ページ先頭

©2009-2026 Movatter.jp