ホームページ >バックエンド開発 >Python チュートリアル >FastAPI で特定のルートのエラー応答をカスタマイズするにはどうすればよいですか?

FastAPI で特定のルートのエラー応答をカスタマイズするにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-20 00:54:03595ブラウズ

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 (カスタム例外) Handler)

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-Except 内で例外を処理できます。ブロック:

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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。