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] 기본값이 0
인 int
타입의 optional query 매개변수 skip
3] 기본값이 100
인 int
타입의 optional query 매개변수 limit
- 그 후 이와 같은 값들을 포함한
dict
를 반환한다.
2) Import Depends
- 먼저,
fastapi
의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
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는 다음과 같은 것들을 처리한다.
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를 선언할 수 있다.