概要
過去に使ったときは 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 件のコメント:
コメントを投稿