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

Susan Sarandon
リリース: 2024-11-24 09:59:15
オリジナル
313 人が閲覧しました

How to Customize Error Responses for Specific FastAPI Routes?

FastAPI で特定のルートのエラー応答をカスタマイズする方法

FastAPI では、RequestValidationError を発生させることでカスタム エラー応答を送信できます。これは、必須ヘッダーなど、特定の条件を満たす必要があるエンドポイントに役立ちます。

オプション 1: デフォルトの例外ハンドラーをオーバーライドする

このオプションを使用すると、デフォルトの例外ハンドラーをオーバーライドできます。 RequestValidationError を使用すると、エラー応答をカスタマイズできます。

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

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:
        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-application

サブアプリケーションを作成すると、独自の例外ハンドラーを持つ個別の API インスタンスを作成できます。これにより、サブアプリケーション専用のエラー処理をカスタマイズできます。

from fastapi import FastAPI
from fastapi.exceptions import RequestValidationError
from fastapi.responses import JSONResponse

app = FastAPI()
subapi = FastAPI()

@subapi.exception_handler(RequestValidationError)
async def validation_exception_handler(exc: RequestValidationError):
    return JSONResponse(content={'401': 'Unauthorized'}, status_code=401)
    
@subapi.get('/')
async def subapi_route(some_custom_header: str = Header(...)):
    return {'some-custom-header': some_custom_header}

app.mount('/sub', subapi)
ログイン後にコピー

オプション 3: カスタム APIRoute クラスを使用する

このメソッドを使用すると、特定のルートの動作を変更できます。カスタム APIRoute クラスを使用します。

from fastapi import FastAPI, APIRouter, Response, Request, Header, HTTPException
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')

        return custom_route_handler

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

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

app.include_router(router)
ログイン後にコピー

どのオプションを使用する必要がありますかuse?

オプション 1 は、特定のルートのエラー応答をカスタマイズする必要がある場合にのみ実装するのが簡単です。オプション 2 は、さまざまなセキュリティ ポリシーや例外処理を適用するなど、API のサブエリアをさらに制御したい場合に適しています。オプション 3 を使用すると、個々のルートをより詳細に制御できるため、ルート内の特定のケースを処理するのに役立ちます。

以上が特定の FastAPI ルートのエラー応答をカスタマイズするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート