11

FastAPI 検証メッセージを人間が読める形式にフォーマットするためのライブラリまたはコードの例を探しています。たとえば、このエンドポイント:

@app.get("/")
async def hello(name: str):
    return {"hello": name}

nameクエリ パラメータが欠落している場合、次の json 出力が生成されます。

{ 
    "detail":[ 
        { 
            "loc":[ 
                "query",
                "name"
            ],
            "msg":"field required",
            "type":"value_error.missing"
        }
    ]
}

だから私の質問は、方法:

  1. トーストに表示するには、「名前フィールドが必要です」のようなものに変換します (あらゆる種類のエラーが発生する可能性があります)。
  2. フォーム検証メッセージを表示するために使用します
  3. 可能であれば、API の説明からフォーム自体を生成する
4

1 に答える 1

8

FastAPI には優れた例外処理機能があるため、さまざまな方法で例外をカスタマイズできます。

HTTPException を発生させることができます。HTTPException は、API に関連する追加データを含む通常の Python 例外です。しかし、それを返すことはできません。これは Python の例外であるため、発生させる必要があります。

from fastapi import HTTPException
...
@app.get("/")
async def hello(name: str):
    if not name:
        raise HTTPException(status_code=404, detail="Name field is required")
    return {"Hello": name}

クエリパラメータとして追加するname: strことで自動的に必須になるので、追加する必要がありますOptional

from typing import Optional
...
@app.get("/")
async def hello(name: Optional[str] = None):
    error = {"Error": "Name field is required"}
    if name:
        return {"Hello": name}
    return error

$ curl 127.0.0.1:8000/?name=imbolc
{"Hello":"imbolc"}
...
$ curl 127.0.0.1:8000
{"Error":"Name field is required"}

しかし、あなたの場合、これがFastAPIをオーバーライドしてエラーを処理する最良の方法だと思いますvalidation_exception_handler

from fastapi import FastAPI, Request, status
from fastapi.encoders import jsonable_encoder
from fastapi.exceptions import RequestValidationError
from fastapi.responses import JSONResponse
...
@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({"detail": exc.errors(), "Error": "Name field is missing"}),
    )
...
@app.get("/")
async def hello(name: str):
    return {"hello": name}

次のような応答が返されます。

$ curl 127.0.0.1:8000

 {
   "detail":[
      {
         "loc":[
            "query",
            "name"
         ],
         "msg":"field required",
         "type":"value_error.missing"
      }
   ],
   "Error":"Name field is missing"
}

contentただし、必要に応じてカスタマイズできます。

{
"Error":"Name field is missing",
   "Customize":{
      "This":"content",
      "Also you can":"make it simpler"
   }
}
于 2020-07-16T14:41:28.613 に答える