概要
flask はリクエストの情報は request.json などで受け取り必要に応じて自分で Python のモデルクラスに変換します
pydantic を使えば自動でモデルに変換してくれたりバリデーションを簡単に実装できる仕組みを提供してくれます
今回は flask の拡張である Flask-Pydantic を使って flask 上で pydantic を使う方法を紹介します
環境
- macOS 11.7.3
- Python 3.10.2
- flask 2.2.3
- Flask-pydantic 0.11.0
- pydantic 1.10.5
インストール
- pipenv install Flask-Pydantic
サンプルコード: POST時のリクエストボディを自動でモデルに変換する
from typing import Optional
from flask import Flask
from pydantic import (BaseModel,
validator)
from flask_pydantic import validate
app = Flask(__name__)
class ResponseModel(BaseModel):
id: int
age: int
name: str
nickname: Optional[str]
class RequestBodyModel(BaseModel):
name: str
nickname: Optional[str]
@validator("name")
def check_name(cls, v, values, **kwargs):
if v != "hawksnowlog":
raise ValueError()
return v
@app.route("/", methods=["POST"])
@validate()
def post(body: RequestBodyModel):
name = body.name
nickname = body.nickname
return ResponseModel(name=name,
nickname=nickname,
id=0,
age=1000)
ちょっと解説
pydantic.BaseModel を継承してリクエストとレスポンスモデルは定義します
フィールドの型チェックは自動で行ってくれますが特定の条件でバリデーションしたい場合は pydantic.validator を使ってバリデーションします (この辺りは普通の pydantic の使い方として使えます)
今回はボディを変換してほしいので flask のルーティングの引数に body を指定しています
パスパラメータやクエリストリングも対象にすることができます
動作確認
- pipenv run flask run
で起動したら curl でリクエストします
-
curl localhost:5000 -XPOST -d '{"name":"hawksnowlog","nickname":"hawk"}' -H 'content-type: application/json'
=> {"id": 0, "age": 1000, "name": "hawksnowlog", "nickname": "hawk"}
最後に
fastapi のように flask でも pydantic を扱うことができました
flask ですでにプロジェクトが動いている場合などには使えるかなと思います
0 件のコメント:
コメントを投稿