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. 테스트가 용이해집니다. 각 컴포넌트를 분리하여 테스트하기 수월해질 것입니다.
'Python > Backend' 카테고리의 다른 글
FastAPI에서 sqlalchemy 활용 SQL DB CRUD 구현 예제 (0) | 2024.05.23 |
---|---|
FastAPI에서 MongoDB 데이터 연동 CRUD 예제 (0) | 2024.05.06 |
FastAPI get, post, patch, delete 예제 코드 정리 (0) | 2024.04.24 |