2022年10月20日木曜日

FastAPIでDependsを使ってパスパラメータのバリデーションにpydanticを使う方法

FastAPIでDependsを使ってパスパラメータのバリデーションにpydanticを使う方法

概要

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 件のコメント:

コメントを投稿