FlaskでAPIリクエストのバリデーションをする方法!初心者でもわかるPydanticとSchemaの使い方
生徒
「先生、FlaskでAPIを作ってるんですけど、入力されたデータをちゃんと確認する方法ってありますか?」
先生
「いい質問ですね。Flaskでは、Pydanticというライブラリを使うと、APIに送られてきたデータを簡単にチェックできますよ。」
生徒
「それって難しいですか?プログラミング初心者でもできますか?」
先生
「もちろんです!今日は、パソコン初心者でもわかるように、超やさしく説明していきますね。」
1. リクエストバリデーションとは?
リクエストバリデーションとは、ユーザーがフォームやAPIに送ってくるデータが正しいかをチェックする作業のことです。
たとえば「年齢」が「数字じゃない文字」だったり、「名前」が「空っぽ」だったらエラーにしたいですよね?それを自動でチェックするのが、バリデーション(検証)です。
2. Flaskとは?Pydanticとは?初心者向けに説明!
Flask(フラスク)は、Python(パイソン)というプログラミング言語で作られた、Webアプリケーションを簡単に作れるツールです。
Pydantic(パイダンティック)は、データの正しさをチェックするための道具(ライブラリ)です。「このデータは整数でなきゃダメ」とか「空っぽじゃダメ」とかを、簡単に指定できます。
3. Flask + PydanticでAPIを作ってバリデーションする方法
それでは、FlaskとPydanticを使って、実際にAPIを作ってみましょう!
今回は、「ユーザー登録」をするAPIを例にします。送られてくるデータに、「名前(name)」と「年齢(age)」が含まれているとします。
※APIとは、アプリ同士が会話するための窓口のようなものです。
from flask import Flask, request, jsonify
from pydantic import BaseModel, ValidationError
from typing import Optional
app = Flask(__name__)
# 入力データのルール(スキーマ)を定義
class UserSchema(BaseModel):
name: str
age: int
@app.route('/register', methods=['POST'])
def register():
try:
# ユーザーの送ったデータを取得
user_data = request.json
# Pydanticでバリデーション(検証)
user = UserSchema(**user_data)
return jsonify({
"message": "登録成功!",
"user": user.dict()
})
except ValidationError as e:
return jsonify({
"error": "入力データに問題があります。",
"details": e.errors()
}), 400
if __name__ == '__main__':
app.run(debug=True)
4. 実行して確認してみよう
このコードをapp.pyという名前で保存し、下記のようにターミナルで実行します。
python app.py
次に、別のツール(たとえばPostmanやcurl)を使って、下記のようなリクエストを送ってみます。
POST /register
Content-Type: application/json
{
"name": "たろう",
"age": 25
}
すると、次のような結果が返ってきます。
{
"message": "登録成功!",
"user": {
"name": "たろう",
"age": 25
}
}
もし、年齢が文字(例:「二十歳」)だった場合は、エラーになります。
{
"error": "入力データに問題があります。",
"details": [
{
"loc": ["age"],
"msg": "value is not a valid integer",
"type": "type_error.integer"
}
]
}
5. Pydanticのスキーマで何ができるの?
スキーマとは、「データの設計図」です。どんな形のデータが送られてくるかを、あらかじめ決めておけるので、チェックがとても簡単です。
Pydanticを使えば、次のようなことが自動でできます:
- 必須の項目があるかチェック
- 文字か数字かなど、データの種類をチェック
- エラーがあった場合、どこがおかしいか教えてくれる
6. よくある質問とエラー例
Q1: 入力が空っぽだったらどうなるの?
A1: 必須項目がないと、自動でエラーになります。たとえば「name」がなければ、次のように返ってきます。
{
"error": "入力データに問題があります。",
"details": [
{
"loc": ["name"],
"msg": "field required",
"type": "value_error.missing"
}
]
}
Q2: エラーの内容が英語でわかりづらい…
A2: そうですね。初心者のうちはちょっと戸惑うかもしれませんが、Pydanticが「どの項目に」「どんなエラーがあるか」を丁寧に教えてくれてると思って見てみてください。
7. FlaskとPydanticを使うメリット
- 自動でエラーチェックしてくれるので、コードが短くてすむ
- どこにエラーがあるか詳しく返してくれるので、バグに気づきやすい
- 型(たとえばintやstr)を明示的に指定できるので、安全なプログラムになる
初心者でも、安心してAPIを作るための土台になります!
まとめ
FlaskでAPIを作るときに欠かせない「リクエストバリデーション」について、今回の記事ではとても丁寧に学んできました。特に、Pydanticという強力なバリデーションライブラリをFlaskと組み合わせることで、入力データのチェックを自動化でき、より安全で堅牢なAPIを作れるという点は大きな魅力です。リクエストバリデーションは、ユーザーが送ってくるJSONデータの中身が正しい形かどうかを判断し、問題があればエラーとして返す大切な工程です。たとえば、名前が空欄になっていたり、年齢が本来数値であるべきなのに文字列になっている場合、アプリが意図しない動作をすることを防ぐためにも、事前のチェックは欠かせません。 FlaskとPydanticの組み合わせ最大の利点は、スキーマ(設計図)を作るだけで、自動的に「型のチェック」「必須項目の確認」「エラーメッセージの生成」までを行ってくれることです。初心者でも扱いやすいシンプルな書き方でありながら、内部では非常に高度なチェックが行われているため、安全性の高いAPIを実装できます。また、ValidationErrorを丁寧に返せるため、ユーザー側も「どこが間違っているのか」が明確になり、アプリの利用者にも優しい設計になります。 さらに今回の学習を深めるため、Pydanticを使った少し発展的なバリデーション例も紹介します。日付やメールアドレス、特定の条件を満たすデータなど、より応用的なチェックが必要な場合もとても簡単に書けます。以下に、追加条件を含めたサンプルコードを掲載します。
追加のバリデーションサンプル(メール・年齢制限・任意項目など)
from flask import Flask, request, jsonify
from pydantic import BaseModel, EmailStr, Field, ValidationError
app = Flask(__name__)
# 拡張版スキーマ
class ExtendedUserSchema(BaseModel):
name: str = Field(..., min_length=1, max_length=30)
age: int = Field(..., ge=0, le=120) # 0〜120歳まで
email: EmailStr # 自動でメール形式かチェック
nickname: str | None = None # 任意項目
@app.route('/register_ex', methods=['POST'])
def register_ex():
try:
data = request.json
user = ExtendedUserSchema(**data)
return jsonify({
"message": "拡張バリデーション成功!",
"user": user.dict()
})
except ValidationError as e:
return jsonify({
"error": "データエラーがあります。",
"details": e.errors()
}), 400
if __name__ == "__main__":
app.run(debug=True)
このように、より高度なバリデーションもとても短く書けるのがPydanticの強みです。「年齢が0〜120の範囲かどうか」「メールアドレス形式が正しいか」「名前の長さが適切か」など、細かな制約も簡単に指定できます。さらに「nickname」のような任意項目を扱うことも可能で、現実的なユーザー登録APIにも応用できます。 APIは外部とデータをやり取りする窓口なので、データの安全性を守るためには今回のようなバリデーションが非常に重要になります。誤った形式のデータがそのまま内部処理に回ってしまうと、アプリのエラーやデータ破損につながる可能性もあります。FlaskとPydanticを組み合わせれば、そうしたリスクを事前に防ぎ、信頼性の高いAPIを実現できます。初心者でも扱いやすく、プロの現場でも多く利用されている方法なので、ぜひ習得しておきたい技術です。
生徒
「Pydanticを使うと、こんなに簡単にデータのチェックができるんですね!びっくりしました。」
先生
「そうなんです。スキーマを書くだけで型のチェックや必須項目の確認まで自動でやってくれるので、とても便利ですよ。」
生徒
「今までは自分で if 文を書いて条件分岐していたので、すごくコードが長くなっていました…。これならきれいなコードが書けそうです!」
先生
「その通り。バリデーションは手書きするよりも、専用ライブラリを使う方が安全で確実なんですよ。エラーメッセージも自動で作ってくれますしね。」
生徒
「メールの形式をチェックしたり、年齢の範囲を決めたりするのも簡単なんですね。実際のサービスにも役立ちそうです!」
先生
「その気づきは大切です。実際のアプリでは、ユーザー入力を信頼しすぎると危険なので、今回のようなバリデーションは欠かせません。」
生徒
「ありがとうございます!これでFlaskのAPI作りがもっと安全にできそうです!」