FastAPI 공식문서 따라하기[28] - Dependencies - Sub-dependencies
https://fastapi.tiangolo.com/tutorial/dependencies/sub-dependencies/ 공식문서 따라하는 글
FastAPI는 종속성을 갖 종속성함수 즉, 하위 종속성들을 정의하고 이를 처리해주는것을 도와줍니다.
☑️ First dependency “dependable”
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from fastapi import Cookie, Depends, FastAPI
app = FastAPI()
def query_extractor(q: str | None = None):
return q
def query_or_cookie_extractor(
q: str = Depends(query_extractor), last_query: str | None = Cookie(default=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}
이 예제는 매우 직관적이라 실제 사용되기 어려운 예제이지만, 이해하는데 도움을 준다고 합니다.
read_query()
는 query_or_cookie_extractor()
의 의존성을 갖고, query_or_cookie_extractor()
는 query_extractor()
의 의존성을 갖습니다.
☑️ Second dependency, “dependable” and “dependant”
query_or_cokkie_extractor()
함수는 read_query
이 호출하고 의존성으로 엮어있는데, 이러한 의존성 함수를 dependable
라고 합니다. 또한 이 의존성 함수는 다시 의존성 함수 query_extractor
를 호출합니다.
당연한 이야기겠지만
read_query
는query_or_cookie_extractor()
를 호출합니다. 다만,FastAPI
는 의존성을 해결하기 위해서 하위의존성인query_extractor()
를 제일 먼저 처리합니다.
☑️ Using the same dependency multiple times
오역이 있을 수 있습니다. 틀린 정보라면 댓글을 달아주세요!!
만약 여러 의존성 함수들이 하위 의존성 함수로 같은 함수의 값을 받는다면 FastAPI
는 한 번 호출에 한 번 의존성 함수를 들립니다.
이러한 동작방식은 최초 하위 의존성 함수에 들릴 때, cache
를 통해 값을 저장하고 리턴합니다. 그리고 모든 상위 의존성 함수에 값을 전달합니다.
만약 dependency
를 사용하지 않고 해당 함수를 여러번 호출해야한다면, use_cache=False
구문을 통해 매개변수를 설정해줄 수 있습니다.
예제
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
from fastapi import Cookie, Depends, FastAPI
app = FastAPI()
def query_extractor(q: str | None = None):
print(q)
return q
def query_or_cookie_extractor(
q: str = Depends(query_extractor), last_query: str | None = Cookie(default=None)
):
if not q:
return last_query
return q
def test_depend(
q: str = Depends(query_extractor, use_cache=False)
):
return q
@app.get("/items/")
async def read_query(
query_or_default: str = Depends(query_or_cookie_extractor),
query_test: str = Depends(test_depend)):
return {"q_or_cookie": query_or_default, "query_test": query_test}
test_depend()
를 보면 query_or_cookie_extractor()
와 같이 같은 의존성함수인 query_extractor
를 호출하고 있습니다. 만약, use_cache=False
구문이 없다면 query_extractor
가 단 한 번만 호출될 것입니다.