>  기사  >  백엔드 개발  >  FastAPI의 특정 경로에 대한 오류 응답을 사용자 정의하는 방법은 무엇입니까?

FastAPI의 특정 경로에 대한 오류 응답을 사용자 정의하는 방법은 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-11-20 00:54:03538검색

How to Customize Error Responses for Specific Routes in FastAPI?

FastAPI에서 특정 경로에 대한 오류 응답을 사용자 정의하는 방법

FastAPI에서는 다음을 재정의하여 특정 경로에 대한 오류 응답을 사용자 정의할 수 있습니다. RequestValidationError에 대한 예외 처리기입니다. 다음은 몇 가지 옵션입니다.

옵션 1(단순)

OpenAPI 문서에서 헤더가 선택 사항으로 표시되는 것이 괜찮다면 다음을 사용할 수 있습니다. 다음 코드:

from fastapi import Header, HTTPException

@app.post("/")
def some_route(some_custom_header: Optional[str] = Header(None)):
    if not some_custom_header:
        raise HTTPException(status_code=401, detail="Unauthorized")
    return {"some-custom-header": some_custom_header}

옵션 2(사용자 정의 예외 처리기)

OpenAPI 문서에 필요한 대로 헤더가 표시되도록 하려면 예외 처리기를 재정의할 수 있습니다.

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 for the specific Header in the errors
        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}),
    )

@app.get("/")
def some_route(some_custom_header: str = Header(...)):
    return {'some-custom-header': some_custom_header}

옵션 3(하위 애플리케이션)

하위 애플리케이션을 만들어 메인 앱에 탑재할 수 있습니다. 이렇게 하면 하위 애플리케이션에 정의된 경로에 대해서만 예외 처리기를 사용자 정의할 수 있습니다.

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

app = FastAPI()

@app.get('/')
async def main():
    return {'message': 'Hello from main API'}
    

subapi = FastAPI()
   
@subapi.exception_handler(RequestValidationError)
async def validation_exception_handler(request: Request, exc: RequestValidationError):
    # Custom exception handling
    return JSONResponse(content={'401': 'Unauthorized'}, status_code=401)


@subapi.get('/')
async def sub_api_route(some_custom_header: str = Header(...)):
    return {'some-custom-header': some_custom_header}    


app.mount('/sub', subapi)

옵션 4(사용자 정의 APIRouter 및 예외 처리)

사용자 정의 APIRouter 클래스를 사용하고 try-Exception 블록 내에서 예외를 처리할 수 있습니다.

from fastapi import FastAPI, APIRouter, Response, Request, Header, HTTPException
from fastapi.responses import JSONResponse
from fastapi.exceptions import RequestValidationError
from fastapi.routing import APIRoute
from typing import Callable

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:
                # Custom exception handling
                raise HTTPException(status_code=401, detail='401 Unauthorized')
                            
        return custom_route_handler


app = FastAPI()
router = APIRouter(route_class=ValidationErrorHandlingRoute)


@app.get('/')
async def main():
    return {'message': 'Hello from main API'}
    

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


app.include_router(router)

요구 사항에 가장 적합한 옵션을 선택하세요.

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

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.