FastAPI의 특정 경로에 대한 오류 응답을 어떻게 사용자 정의할 수 있습니까?

Barbara Streisand
풀어 주다: 2024-11-22 16:18:20
원래의
149명이 탐색했습니다.

How Can I Customize Error Responses for Specific Routes in FastAPI?

FastAPI의 특정 경로에 대한 오류 응답 사용자 정의

개요

FastAPI [1](#sources)다용도 플랫폼 사용자 정의 오류 특정 경로에 대한 응답. 이를 통해 개발자는 특정 애플리케이션 요구 사항에 따라 오류 처리를 맞춤할 수 있습니다. 기본 예외 처리기를 재정의하거나 하위 애플리케이션과 같은 다른 기술을 사용하면 사용자 경험을 향상하고 의미 있는 피드백을 제공하는 사용자 정의 오류 응답을 만들 수 있습니다.

옵션 1: 기본 예외 처리기 재정의

한 가지 접근 방식은 RequestValidationError에 대해 기본 예외 처리기를 재정의하는 것입니다. 이 예외는 요청에 잘못된 데이터가 포함된 경우 발생합니다. 사용자 정의 핸들러를 구현하면 필수 사용자 정의 헤더와 관련된 특정 오류를 확인하고 사용자 정의 오류 응답을 반환할 수 있습니다.

from fastapi import FastAPI, Request, Header, status
from fastapi.exceptions import RequestValidationError
from fastapi.responses import JSONResponse
from fastapi.encoders import jsonable_encoder

app = FastAPI()
routes_with_custom_exception = ['/']

@app.exception_handler(RequestValidationError)
async def validation_exception_handler(request: Request, exc: RequestValidationError):
    if request.url.path in routes_with_custom_exception:
        # check whether the error relates to the `some_custom_header` parameter
        for err in exc.errors():
            if err['loc'][0] == 'header' and err['loc'][1] == 'some-custom-header':
                return JSONResponse(content={'401': 'Unauthorized'}, status_code=401)
            
    return JSONResponse(
        status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
        content=jsonable_encoder({'detail': exc.errors(), 'body': exc.body}),
    )
로그인 후 복사

옵션 2: Sub -애플리케이션

또 다른 대안은 하위 애플리케이션 생성과 기본 애플리케이션에 마운트합니다. 이를 통해 기본 애플리케이션의 다른 경로에 영향을 주지 않고 하위 애플리케이션 내의 경로에 특정한 사용자 정의 오류 처리가 가능합니다.

# main API
app = FastAPI()

# sub-application with custom error handling
subapi = FastAPI()
@subapi.exception_handler(RequestValidationError)
async def validation_exception_handler(request: Request, exc: RequestValidationError):
    # Handle error specific to sub-application's routes
    return JSONResponse(content={'401': 'Unauthorized'}, status_code=401)

# mount sub-application
app.mount('/sub', subapi)
로그인 후 복사

옵션 3: 사용자 정의 APIRoute 클래스

이 접근 방식에는 try-Exception 블록 내에서 요청 검증을 처리하는 사용자 정의 APIRoute 클래스를 생성하는 작업이 포함됩니다. RequestValidationError가 발생하면 사용자 정의 오류 응답이 반환될 수 있습니다.

from fastapi import FastAPI, APIRouter, APIRoute, Request, Header, HTTPException
from fastapi.responses import JSONResponse
from fastapi.exceptions import RequestValidationError

class ValidationErrorHandlingRoute(APIRoute):
    def get_route_handler(self) -> Callable:
        original_route_handler = super().get_route_handler()

        async def custom_route_handler(request: Request) -> Response:
            try:
                return await original_route_handler(request)
            except RequestValidationError as e:
                raise HTTPException(status_code=401, detail='401 Unauthorized')

# create new router with custom error handling
router = APIRouter(route_class=ValidationErrorHandlingRoute)

# add custom error handling to router
@router.get('/custom')
async def custom_route(some_custom_header: str = Header(...)):
    return {'some-custom-header': some_custom_header}

# add router to app 
app.include_router(router)
로그인 후 복사

결론

이러한 기술을 탐색함으로써 개발자는 특정 요구 사항에 맞게 FastAPI의 오류 응답을 사용자 정의하여 더 많은 기능을 제공할 수 있습니다. 맞춤형 사용자 경험 및 향상된 오류 처리 기능.

소스

  1. [FastAPI 문서: HTTP 예외 처리](https://fastapi.tiangolo.com/Exception-handlers/)

위 내용은 FastAPI의 특정 경로에 대한 오류 응답을 어떻게 사용자 정의할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿