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

Mary-Kate Olsen
リリース: 2024-11-20 00:35:02
オリジナル
669 人が閲覧しました

How to Customize FastAPI's Error Response for Specific Routes?

FastAPI の特定のルートのエラー応答をカスタマイズ

FastAPI では、リクエストを検証するときに、パラメータが欠落しているか無効である場合、 FastAPI は RequestValidationError 例外を発生させます。デフォルトでは、この例外は 422 Unprocessable Entity 応答を返します。ただし、特定のルートに合わせてこの応答をカスタマイズすることもできます。これを実現するためのいくつかのアプローチを次に示します。

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

RequestValidationError のデフォルトの例外ハンドラーをオーバーライドし、目的の例外ハンドラーを提供します。

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

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)
ログイン後にコピー

オプション 2: サブアプリケーションを使用する

サブアプリケーションを作成し、それをメイン アプリにマウントします。特定のルート。サブアプリケーションで RequestValidationError の例外ハンドラーをオーバーライドします。

from fastapi import FastAPI, RequestValidationError, HTTPException
from fastapi.responses import JSONResponse

app = FastAPI()
subapi = FastAPI()

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

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

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

カスタム APIRoute サブクラスを作成してオーバーライドしますget_route_handler メソッド。これにより、リクエストをインターセプトし、RequestValidationError 例外を処理できるようになります。

from fastapi import FastAPI
from fastapi.routing import APIRoute
from fastapi.responses import JSONResponse
from fastapi.exceptions import RequestValidationError
from fastapi.requests import Request

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

        async def custom_route_handler(request: Request):
            try:
                return await original_route_handler(request)
            except RequestValidationError as e:
                return JSONResponse(content={'401': 'Unauthorized'}, status_code=401)

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

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