2024年1月12日金曜日

flask-pydantic が v2 に対応していたので試してみた

flask-pydantic が v2 に対応していたので試してみた

概要

過去に使ったときは pydantic v2 に対応していませんでした
flask-pydantic 0.12.0 で対応したようなので使ってみました

環境

  • macOS 11.7.10
  • Python 3.11.6
    • flask 3.0.0
    • pydantic 2.5.3
    • flask-pydantic 0.12.0

サンプルコード

from typing import Optional

from flask import Flask, jsonify
from flask_pydantic import ValidationError, validate
from pydantic import BaseModel, field_validator

app = Flask(__name__)
app.config["FLASK_PYDANTIC_VALIDATION_ERROR_RAISE"] = True


class ResponseModel(BaseModel):
    id: int
    age: int
    name: str
    nickname: Optional[str]


class RequestBodyModel(BaseModel):
    name: str
    nickname: Optional[str]

    @field_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)


@app.errorhandler(ValidationError)
def handle_bad_request(_):
    return jsonify({"error": "validation_error"}), 400


app.register_error_handler(400, handle_bad_request)

所感

開発はまだまだ途中という感じかなと思います
エラーハンドリングの部分が微妙で今回 FLASK_PYDANTIC_VALIDATION_ERROR_RAISE というフラグを True にしています
これがない状態で ValueError を投げると json にシリアライズする部分でエラーになり json のエラー構文が返ってきません
なので flask-pydantic 側でハンドリングはせずにアプリ側でハンドリングを実装してあげる必要があります
これに関してはそのうち直る可能性はありそうですがそれ以外でもまだバグがありそうなので v2 対応はまだ様子見なのかもしれません

参考サイト

0 件のコメント:

コメントを投稿