Skip to content

25. Dependencies - First Steps


1. Dependencies - First Steps

  • FastAPI에는 매우 강력하지만 직관적인 Dependency Injection 시스템이 있다.
  • 모든 개발자가 다른 구성 요소를 FastAPI와 통합하기 쉽도록 설계되었다.


2. What is "Dependency Injection"

  • "Dependency"란, path operation functions와 같은 코드를 작동하고 사용하기 위해 필요한 것들을 선언하는 것을 의미한다.
  • "Injection"이란, FastAPI와 같이 dependencies를 제공하는 데 필요한 모든 것을 처리하는 것이다.
  • 이러한 Dependency Injection은 다음과 같이 코드 반복을 최소화해야 할 경우에 매우 유용하다.


1] 동일한 코드 로직이 반복되는 것과 같이 공유 로직이 있다.

2] 데이터베이스 연결을 공유한다.

3] 보안, 인증 등을 실시한다.

4] 기타


3. First Steps

  • Dependency Injection 시스템이 작동하는 방식을 살펴보자.


1) Create a dependency, or "dependable"

  • 다음의 예제는 path operation function이 취할 수 있는 모든 매개변수를 취할 수 있는 함수를 보여주는 예제이다.


from typing import Optional
from fastapi import FastAPI, Depends

app = FastAPI()

async def common_parameters(q: Optional[str] = None, skip: int = 0, limit: int = 100):
    return {"q": q, "skip": skip, "limit": limit}

@app.get("/items/")
async def read_items(commons: dict = Depends(common_parameters)):
    return commons

@app.get("/users/")
async def read_users(commons: dict = Depends(common_parameters)):
    return commons


  • 위의 예제에서 dependency로 사용될 async def common_parameters()를 생성했다.
  • 이 함수는 일반적인 path operation function이 가지고 있는 것과 같은 모양과 구조를 가지고 있다.
  • 단순히 "데코레이터"가 없는 path operation function이며, 비록 데코레이터가 없더라도 원하는 것을 반환할 수 있다.
  • async def common_parameters()는 다음과 같은 값이 들어오기를 예상한다.


1] str 타입의 optional query 매개변수 q

2] 기본값이 0int 타입의 optional query 매개변수 skip

3] 기본값이 100int 타입의 optional query 매개변수 limit


  • 그 후 이와 같은 값들을 포함한 dict를 반환한다.


2) Import Depends

  • 먼저, fastapiDepends를 임포트한다.


from typing import Optional
from fastapi import FastAPI, Depends

app = FastAPI()

async def common_parameters(q: Optional[str] = None, skip: int = 0, limit: int = 100):
    return {"q": q, "skip": skip, "limit": limit}

@app.get("/items/")
async def read_items(commons: dict = Depends(common_parameters)):
    return commons

@app.get("/users/")
async def read_users(commons: dict = Depends(common_parameters)):
    return commons


3) Declare the dependency, in the "dependant"

  • path operation function 매개변수로 Body, Query 등을 사용하는 것과 같이 Depends를 사용할 수 있다.


from typing import Optional
from fastapi import FastAPI, Depends

app = FastAPI()

async def common_parameters(q: Optional[str] = None, skip: int = 0, limit: int = 100):
    return {"q": q, "skip": skip, "limit": limit}

@app.get("/items/")
async def read_items(commons: dict = Depends(common_parameters)):
    return commons

@app.get("/users/")
async def read_users(commons: dict = Depends(common_parameters)):
    return commons


  • path operation function 매개변수로 Body, Query 등을 사용하는 것과 같이 Depends를 사용할 수 있지만, Depends는 약간 다르게 작동한다.
  • Depends에는 단일 매개변수만 넘겨줄 수 있는데, 이 단일 매개변수는 함수 자체가 된다.
  • 그리고 그 함수는 path operation function과 같은 매개변수를 취한다.


  • 위의 예제를 실행한 후 새로운 request가 도착하면, FastAPI는 다음과 같은 것들을 처리한다.


001


1] 올바른 매개변수를 사용하여 dependency ("dependable") 함수를 호출한다.

2] 함수에서 결과를 가져온다.

3] 그 결과를 path operation function의 매개변수에 할당한다.


  • 이렇게 dependency 함수를 한 번만 작성하면, FastAPI가 path operation function을 위해 이 함수를 호출하게 된다.


4. To async or not to async

  • dependencies는 FastAPI에 의해 호출되므로 어떠한 함수를 정의하더라도 동일한 규칙이 적용된다.
  • 즉, async def 또는 일반적인 def를 사용할 수 있다.
  • 그리고 일반적인 def path operation functions 내부에서 async def로 dependencies를 선언하거나, async def path operation functions 내부에서 일반적인 def로 dependencies를 선언할 수 있다.

References

다음 페이지