Victoree's Blog

[5] Dependency Injection이란? in Fast API 본문

Python/Fast API

[5] Dependency Injection이란? in Fast API

victoree 2021. 7. 22. 13:59
728x90

1. 의존성 주입이란?

코드가 작동하고 사용하는데 필요한 종속성을 선언하는 방법이 있음

→ 종속성을 코드에 넣는데 필요한 모든 작업을 처리할 수 있음

  • 공통의 코드(중복 코드) 존재 시
  • 데이터베이스 연결
  • 보안, 인증, 등등

[ 간단한 예시 ]

from fastapi import Depends, FastAPI

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

class CommonQueryParams:
    def __init__(self, q: Optional[str] = None, skip: int = 0, limit: int = 100):
        self.q = q
        self.skip = skip
        self.limit = limit

@app.get("/items/")
async def read_items(commons: CommonQueryParams = Depends(CommonQueryParams)):
    response = {}
    if commons.q:
        response.update({"q": commons.q})
    items = fake_items_db[commons.skip : commons.skip + commons.limit]
    response.update({"items": items})
    return response

 

  • 공통 파라미터의 경우, Depends
  • Body, Query 와 같이 사용하지만, 약간 다르게 작동함
    • Depends는 하나의 파라미터만 받을 수 있음
    • 이 파라미터는 Callable한 오브젝트를 받을 수 있음(함수 or class object)

2. dependencies 설정하기 (global / operation)

from fastapi import Depends, FastAPI, Header, HTTPException

app = FastAPI()
# 다음과 같이 global dependencies를 주입할 수도 있음
# app = FastAPI(dependencies=[Depends(verify_token), Depends(verify_key)])

async def verify_token(x_token: str = Header(...)):
    if x_token != "fake-super-secret-token":
        raise HTTPException(status_code=400, detail="X-Token header invalid")

async def verify_key(x_key: str = Header(...)):
    if x_key != "fake-super-secret-key":
        raise HTTPException(status_code=400, detail="X-Key header invalid")
    return x_key

# path operation decorator에 의존성 리스트로 주입
@app.get("/items/", dependencies=[Depends(verify_token), Depends(verify_key)])
async def read_items():
    return [{"item": "Foo"}, {"item": "Bar"}]

3. Router에 Dependency 설정하기

from fastapi import APIRouter, Depends, HTTPException

from ..dependencies import get_token_header

router = APIRouter(
    prefix="/items",
    tags=["items"],
    dependencies=[Depends(get_token_header)],
    responses={404: {"description": "Not found"}},
)

fake_items_db = {"plumbus": {"name": "Plumbus"}, "gun": {"name": "Portal Gun"}}

@router.get("/")
async def read_items():
    return fake_items_db

@router.get("/{item_id}")
async def read_item(item_id: str):
    if item_id not in fake_items_db:
        raise HTTPException(status_code=404, detail="Item not found")
    return {"name": fake_items_db[item_id]["name"], "item_id": item_id} 
  • internal / partner / admin 등 권한이 다른 api의 경우,
    각각의 APIRouter에 dependencies를 설정함으로 각 authorization을 validation 할 수 있음
728x90

'Python > Fast API' 카테고리의 다른 글

[6] Middleware, Background Tasks, Sub Application in Fast API  (0) 2021.07.30
[4] Pydantic Model  (0) 2021.07.22
[3] Fast API Basic - Response 편  (0) 2021.07.20
[2] Fast API Basic - Request 편  (2) 2021.07.20
[1] Fast API로 한걸음!  (0) 2021.07.19
Comments