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 매개변수
q
를 str
타입으로 선언한 다음 반환한다.
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_extractor
는 query_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