Post

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_queryquery_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가 단 한 번만 호출될 것입니다.

use_cache=False가 없을 때

use_cache=False가 있을 때

This post is licensed under CC BY 4.0 by the author.