Python/Backend

FastAPI Depends 예제 및 장점 간단 정리

jimmy_AI 2024. 5. 17. 00:01
반응형

fastapi의 Depends를 통하여 의존성 주입을 하는 간단한 예제를 통해서

사용하면 좋은 이유와 사용 방법을 간략하게 요약해보도록 하겠습니다.

 

 

FastAPI Depends 사용 예제 - 토큰 검사

예를 들어 토큰을 통하여 요청을 진행하는 API가 있다고 가정해 보겠습니다.

이를 위해 토큰 - 유저 매칭을 진행하는 함수를 다음과 같이 작성해 보았습니다.

from fastapi import FastAPI, Depends, HTTPException

app = FastAPI()

# admin token이 abcde, 일반 유저 token이 12345라고 가정
user_info = {"abcde" : "admin", "12345" : "user1"}

def get_current_user(token: str):
    if user_info.get(token) is not None:
        return {"username": "admin"}
    else:
        raise HTTPException(status_code=401, detail="Not Authorized")

 

admin 권한이 필요한 경우,

admin인지를 검사하는 함수도 다음과 같이 작성해볼 수 있을 것입니다.

def check_admin(token: str):
    user = user_info.get(token)
    if user == "admin":
        return {"username": "admin"}
    elif user is not None:
        raise HTTPException(status_code=403, detail="Admin access required")
    else:
        raise HTTPException(status_code=401, detail="Not Authorized")

 

위의 예제에서는 일반 유저인 경우와 허용되지 않은 토큰인 경우에 대해서

오류 메시지를 각각 403 유형401 유형으로 분리하여 작성했습니다.

 

여기서 위의 코드를 다음과 같이 Depends로 의존성을 주입하여

간략화 해볼 수 있습니다.

def check_admin(user: dict = Depends(get_current_user)):
    if user["username"] != "admin":
        raise HTTPException(status_code=403, detail="Admin access required")
    return user

 

위의 코드를 API에서 호출할 때는 token을 검사하는 get_current_user를 먼저 실행하여

실질적으로는 dict가 아니라 토큰 문자열을 input으로 받게 됩니다.

 

이 함수를 통하여 일반 item 조회와 admin 권한이 필요한 item 조회에 대해서

api 호출 코드 예시를 가져와보도록 하겠습니다.

여기서도 Depends를 통하여 위에서 구현한 토큰 검사 로직에 대한 의존성을

쉽게 주입할 수 있게 됩니다.

@app.get("/items/")
async def read_items(user: dict = Depends(get_current_user)):
    return {"items": ["item1", "item2"]}

@app.get("/admin/items/")
async def read_admin_items(admin: dict = Depends(check_admin)):
    return {"items": ["admin_item1", "admin_item2"]}

 

의존성 주입을 통하여 구현했던 API 호출 함수는 다음과 같이 호출해볼 수 있습니다.

# 호출 예시 1
curl "http://api_url/items/?token=12345"

=> {"items": ["item1", "item2"]} # 성공

# 호출 예시 2
curl "http://api_url/items/?token=54321"

=> 401 에러(인증되지 않은 유저)

# 호출 예시 3
curl "http://api_url/admin/items/?token=12345"

=> 403 에러(admin 권한이 필요)

# 호출 예시 4
curl "http://api_url/admin/items/?token=54321"

=> 401 에러(인증되지 않은 유저)

# 호출 예시 5
curl "http://api_url/admin/items/?token=abcde"

=> {"items": ["admin_item1", "admin_item2"]} # 성공

 

 

FastAPI Depends 장점

fastapi의 의존성 주입 기능을 활용하면 다음과 같은 이점을 얻을 수 있습니다.

 

1. 재사용성이 높아집니다. 위의 코드의 토큰 검사 로직 예제는 다른 호출 함수에서도

Depends로 선언만 해주어도 쉽게 사용이 가능할 것입니다.

2. 코드 로직 관리가 용이해집니다. 상위 -> 하위 모듈로의 의존성 흐름을 

더 명확하게 통제할 수 있습니다.

3. 테스트가 용이해집니다. 각 컴포넌트를 분리하여 테스트하기 수월해질 것입니다.