概要
FastAPIのパスパラメータに pydantic の BaseModel を扱う方法を紹介します
ポイントは Depends を使う点です
環境
- macOS 11.6.8
- Python 3.10.2
- FastAPI 0.83.0
サンプルコード
from fastapi import Depends, FastAPI, Path
from pydantic import BaseModel, validator, Field
app = FastAPI()
async def common_parameters(q: str | None = None,
skip: int = 0,
limit: int = 100):
return {"q": q, "skip": skip, "limit": limit}
class Item(BaseModel):
msg: str = Field(Path('msg'))
@validator('msg')
def check_max_length(cls, v, values, **kwargs):
if len(v) > 10:
raise ValueError('Must be 10 characters or less.')
return v
@app.get("/{msg}")
async def read_items(commons: dict = Depends(common_parameters),
msg: Item = Depends(Item)):
return commons
ちょっと解説
パスのモデルクラスは Item としています
そのフィールドでパスパラメータとして来る値を定義します
その際に Field と Path を使うことでパスパラメータに来る値を定義できます msg: str = Field(Path('msg'))
あとは定義したモデルクラスをパスパラメータの型ヒントとしてルーティン側で指定します
その際にデフォルト値として Depends(Item)
とすることでモデルクラスを利用することができるようになります
もし Depends がないと AssertionError: Path params must be of one of the supported types
エラーになります
動作確認
-
pipenv run uvicorn app:app --reload
成功
-
curl -v -XGET 'localhost:8000/hello'
失敗
-
curl -v -XGET 'localhost:8000/hellohellohello'
0 件のコメント:
コメントを投稿