2023年2月27日月曜日

Flask-Pydantic を使ってみた

Flask-Pydantic を使ってみた

概要

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

コメントを投稿