개요
2024.11.05-[FastAPI] response 형식 지정하기에서 FastAPI에서의 응답 데이터를 정의하고 반환하는 방법을 알아보았다.
근데 애플리케이션이 항상 처리를 성공하는 것은 아니다. 예기치 않게 요청에 대한 처리가 실패할 수도 있다. 내부 동작 오류나 요청 데이터에 문제가 있는 등등 여러 가지 문제로 인해 요청을 처리하지 못할 수도 있다.
이번 글에서는 애플리케이션이 요청 처리를 실패했을 때의 응답 방법에 대해 정리한다.
HTTPException
클라이언트에게 오류가 포함된 HTTP 응답을 반환할 때는 HTTPException을 사용한다. 임포트는 아래와 같이 하면 된다.
from fastapi import HTTPException
HTTPException은 애플리케이션 동작 중 오류가 발생할 때 오류를 발생시켜 상태 코드와 상세 메세지를 정의하여 사용한다.
from fastapi import FastAPI, HTTPException
app = FastAPI()
items = {"foo": "The Foo Wrestlers"}
@app.get("/items/{item_id}")
async def read_item(item_id: str):
if item_id not in items:
raise HTTPException(status_code=404, detail="Item not found")
return {"item": items[item_id]}
아래 실행 결과는 애플리케이션에 정의되어 있는 foo라는 items을 찾지 않아서 발생한 오류를 확인한 모습이다.
사용자 정의 예외 처리
사용자 정의 예외를 정의하고 애플리케이션 동작 시 해당 오류를 발생시키는 경우, FastAPI가 사용자 정의 예외를 취급할 수 있도록 할 수 있다.
먼저 다음과 같은 사용자 정의 에러가 있다고 하자.
class MyException(Exception):
def __init__(self, name: str):
self.name = name
해당 에러를 처리하는 함수를 정의하면서 @app.exception_handler 데코레이터를 추가하면 FastAPI가 사용자 정의 에러를 다룰 수 있도록 할 수 있다. 아래 함수는 사용자 정의 에러가 발생하면 HTTP 418 응답 코드와 JSON 메시지를 반환하게끔 처리한 것이다.
from fastapi.responses import JSONResponse
@app.exception_handler(UnicornException)
async def my_exception_handler(request: Request, exc: UnicornException):
return JSONResponse(
status_code=418,
content={"message": f"Oops! {exc.name} did something. There goes a rainbow..."},
)
이제 애플리케이션에서 사용자 정의 예외를 발생시키면 FastAPI가 my_exception_handler를 사용하여 응답하는 것을 확인할 수 있다.
@app.get("/items/{item_id}")
async def read_item(item_id: str):
if item_id not in items:
raise MyException(item_id)
return {"item": items[item_id]}
참고 문서
https://fastapi.tiangolo.com/ko/tutorial/handling-errors/