스택큐힙리스트

어떻게 FastAPI 예외 처리와 사용자 정의 예외 처리를 통합하나요? 본문

카테고리 없음

어떻게 FastAPI 예외 처리와 사용자 정의 예외 처리를 통합하나요?

스택큐힙리스트 2024. 1. 27. 12:49
반응형

파이썬 버전 3.9, FastAPI 버전 0.78.0


응용 프로그램 예외 처리에 사용하는 사용자 정의 기능이 있습니다. 요청이 내부 논리 문제로 실행되었을 때, 즉 어떤 이유로든 HTTP 응답으로 400을 보내고 싶을 때, 유틸리티 함수를 호출합니다.


@staticmethod
def raise_error(error: str, code: int) -> None:
logger.error(error)
raise HTTPException(status_code=code, detail=error)

이 접근 방식을 좋아하지 않습니다. 그래서 다음을 살펴보았습니다.


from fastapi import FastAPI, HTTPException, status
from fastapi.respones import JSONResponse
class ExceptionCustom(HTTPException):
pass
def exception_404_handler(request: Request, exc: HTTPException):
return JSONResponse(status_code=status.HTTP_404_NOT_FOUND, content={message: 404})
app.add_exception_handler(ExceptionCustom, exception_404_handler)

위의 접근 방식에 대한 문제는 메시지를 인수로 전달할 수 없다는 것입니다.

전반적으로 이 주제에 대한 생각이 있으십니까?

답변 1

사용자 정의 예외는 원하는 모든 사용자 정의 속성을 가질 수 있습니다. 다음과 같이 작성한다고 가정해 봅시다:


class ExceptionCustom(HTTPException):
pass

사용자 정의 핸들러에서 다음과 같이 할 수 있습니다:


def exception_404_handler(request: Request, exc: HTTPException):
return JSONResponse(status_code=status.HTTP_404_NOT_FOUND, content={message: exc.detail})

그런 다음 이렇게 예외를 발생시킬 수 있습니다:


raise ExceptionCustom(status_code=404, detail='에러 메시지')

이때 특정 ExceptionCustom에 대한 핸들러를 생성하고 있다는 점을 유의하십시오. 메시지만 필요한 경우 더 일반적인 방법으로 다음과 같이 작성할 수 있습니다:


class MyHTTPException(HTTPException):
pass
def my_http_exception_handler(request: Request, exc: HTTPException):
return JSONResponse(status_code=exc.status_code, content={message: exc.detail})

app.add_exception_handler(MyHTTPException, my_http_exception_handler)

이렇게하면 모든 상태 코드와 메시지로 모든 예외를 발생시킬 수 있으며, JSON 응답에서 message를 얻을 수 있습니다.


FastAPI 문서에서 더 자세한 설명이 있습니다.

답변 2

FastAPI는 Python에서 웹 애플리케이션을 빠르고 효율적으로 개발할 수 있도록 하는 강력한 프레임워크입니다. 이 프레임워크에서 예외 처리는 애플리케이션의 안정성과 신뢰성을 보장하는 데 매우 중요합니다. 개발자가 FastAPI의 예외 처리 기능을 커스터마이징하여 사용하려면 다음 단계를 따릅니다.
1. CustomException 클래스 작성: 커스텀 예외를 처리하기 위해 예외 클래스를 작성해야 합니다. 이 클래스는 Python 내장 Exception 클래스를 상속받아야 합니다. 즉, 다음과 같이 작성할 수 있습니다.
```python
class CustomException(Exception):
def __init__(self, message: str):
self.message = message
super().__init__(self.message)
```
여기서 CustomException은 개발자가 정의한 예외이며, 추가 로직이나 커스텀 메타데이터를 포함할 수 있습니다.
2. 예외 핸들러 등록: FastAPI 애플리케이션의 예외 핸들러를 등록하여 커스텀 예외를 처리할 수 있습니다. FastAPI는 `@app.exception_handler()` 데코레이터를 제공하므로 이를 사용하여 예외 핸들러를 등록할 수 있습니다. 다음 예제에서는 커스텀 예외를 처리하는 예외 핸들러를 등록하는 방법을 보여줍니다.
```python
from fastapi import FastAPI, HTTPException
from my_custom_exceptions import CustomException
app = FastAPI()
@app.exception_handler(CustomException)
async def custom_exception_handler(request, exc):
return JSONResponse(
status_code=exc.status_code,
content={message: exc.message},
)
@app.get(/items/{item_id})
async def read_item(item_id: int):
if item_id == 42:
raise CustomException(Item not found)
return {item_id: item_id}
```
위 예제에서는 CustomException 타입의 예외를 처리하기 위해 `custom_exception_handler(request, exc)` 함수를 등록했습니다. 이 함수는 `request`와 예외 객체 `exc`를 매개변수로 받으며, 사용자 지정 응답을 반환합니다.
이제 FastAPI 애플리케이션에서 요청이 발생하면 커스텀 예외가 발생하면 처리됩니다. 처리된 예외는 등록된 핸들러 함수로 전달되며, 사용자 정의 응답을 반환하게 됩니다. 이렇게 하면 FastAPI의 예외 처리 기능을 커스텀할 수 있습니다.
FastAPI 애플리케이션에서 커스텀 예외 처리를 통합하는 방법에 대해 알아보았습니다. FastAPI는 높은 생산성과 예외 처리 기능을 통해 웹 개발을 좀 더 쉽고 효율적으로 만들어주는 강력한 도구입니다. 이를 통해 안정적인 웹 애플리케이션을 구축할 수 있고, 사용자에게 신뢰성 있는 경험을 제공할 수 있습니다.

반응형
Comments