「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > 特定の FastAPI ルートのエラー応答をカスタマイズするにはどうすればよいですか?

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

2024 年 12 月 21 日に公開
ブラウズ:201

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: サブアプリケーションを使用する

サブアプリケーションを作成すると、独自の例外ハンドラーを持つ別の 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)

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

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

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3