概要
FastAPIフレームワークを使うとき、HTTPリクエストのバリデーションエラーが発生したときのエラーハンドリングを実装しました。今回は、JSONのデコードエラーの時の実装方法を紹介します。
サンプルコード
FastAPIのmain.py
に以下のように実装。
@app.exception_handler(RequestValidationError)
async def validation_exception_handler(request: Request, exc: RequestValidationError):
return JSONResponse(
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
content=jsonable_encoder({"status": "xxxx",
"msg": "xxxxxxxxx"}),
)
上記コードでは、FastAPIの@app.exception_handler
デコレータを使用して、RequestValidationError
という特定の例外が発生した場合に、カスタムのエラーレスポンスを返すための関数(エラーハンドラ関数)を指定しています。
async def validation_exception_handler(request: Request, exc: RequestValidationError):
は、エラーハンドラ関数のシグネチャ。request
はHTTPリクエストオブジェクト、exc
は例外クラスRequestValidationError
を引数として受け取ります。
関数本体では、JSONResponse
を使用してエラーレスポンスを作成。
jsonable_encoder
は、PythonオブジェクトをJSONエンコード可能なデータに変換する関数です。
HTTP_422_UNPROCESSABLE_ENTITY
は、リクエストが受け入れ可能な形式ではない場合やリクエストが処理できない場合に使用されるHTTPステータスコード(400番台は「クライアントエラー」ですね)。
今回はJSONリクエストの形式エラーが発生した場合に適用しています。
参考:FASTAPIの公式ドキュメント
Handling Errors