2023年8月4日金曜日

fastapi でクエリストリングを BaseModel を使って定義する方法

fastapi でクエリストリングを BaseModel を使って定義する方法

概要

Query クラスを使って属性として定義することでクエリストリングをクラスベースで定義できます

環境

  • Python 3.11.3
  • fastapi 0.100.1
  • pypdantic 2.1.1

サンプルコード

  • vim ./app.py
from typing import Optional, Type

from fastapi import Depends, FastAPI, Query, Request
from pydantic import BaseModel, field_validator

app = FastAPI()


class User(BaseModel):
    name: str = Query()
    height: Optional[int] = Query(default=100)

    @field_validator("name")
    @classmethod
    def validate_name(cls, v: str) -> str:
        if v != "hawksnowlog":
            raise ValueError()
        return v


def validate(model: Type[User]):
    async def func(
        request: Request,
        content: model = Depends(),
        name: str = "default",
        height: Optional[int] = 100,
        age: int = Depends(get_age),
    ) -> model:
        print(request)
        print(content)
        if age > 10:
            raise ValueError()
        return User(name=name, height=height)

    return func


def get_age():
    return 10


@app.get("/")
async def query_test(user: User = Depends(validate(User))):
    return user

解説

ちょっと余計な validate が入っていますがこれは普通は不要です

BasModel を継承して Query でフィールドを定義すれば OK です
pydantic V2 からは field_validator というデコレータを使ってクラスメソッドとして各種フィールドのバリデーションを定義することができます

request と content が BaseModel 生成時に渡されるようです

最後に

pydantic V2 を今回は使っています
使い方はあまり変わらないですが使用するデコレータ名が変わっているので注意が必要です

参考サイト

0 件のコメント:

コメントを投稿