概要
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 件のコメント:
コメントを投稿