Skip to content

27. Sub-dependencies


1. Sub-dependencies

  • sub-dependencies가 있는 dependencies를 생성할 수 있다.


1) First dependency "dependable"

  • 다음과 같이 첫 번째 dependency를 생성할 수 있다.


from typing import Optional
from fastapi import FastAPI, Depends, Cookie

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}


  • 위와 같이 optional query 매개변수 qstr 타입으로 선언한 다음 반환한다.


2) Second dependency, "dependable" and "dependant"

  • 동시에 자신의 dependency를 선언하는 다른 dependency 함수를 만들 수 있다.


from typing import Optional
from fastapi import FastAPI, Depends, Cookie

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}


  • 위의 예제에서 query_or_cookie_extractor는 그 자체가 dependency이지만 매개변수로 다른 dependency인 query_extractor 또한 선언한다.
  • 이것은 query_or_cookie_extractorquery_extractor에 의존한다는 의미이다.
  • 또한 추가적으로 optional last_query cookie를 str 타입으로 선언한다.
  • 위의 예제를 실행하면, 클라이언트가 query q를 제공하지 않은 경우 이전에 cookie에 저장한 마지막 query를 사용하게 된다.


3) Use the dependency

  • 다음과 같이 dependency를 사용할 수 있다.


from typing import Optional
from fastapi import FastAPI, Depends, Cookie

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}


  • 위의 예제를 실행하면, FastAPI는 query_or_cookie_extractor에 결과를 전달하기 위해 query_extractor를 먼저 해결해야 한다는 것을 알고 있다.


2. Using the same dependency multiple times

  • 여러 dependencies에 공통 sub-dependency가 있는 것과 같이 dependencies 중 하나가 동일한 path operation에 대해 여러 번 선언된 경우, FastAPI는 해당 sub-dependency를 request당 한 번만 호출해야 한다는 것을 알게 된다.
  • 그리고 반환된 값을 "cache"에 저장하고, 동일한 request에 대해 dependency를 여러 번 호출하는 대신 해당 특정 request에서 이를 필요로 하는 모든 dependencies에 전달한다.


  • "cached" 값을 사용하는 대신 동일한 request의 모든 단계에서 dependency를 호출해야 하는 시나리오에서는 Depends의 매개변수로 use_cache=False를 설정할 수 있다.


async def needy_dependency(fresh_value: str = Depends(get_value, use_cache=False)):
    return {"fresh_value": fresh_value}

References