カテゴリ: Flask 更新日: 2025/12/27

FlaskでAPIリクエストのバリデーションをする方法!初心者でもわかるPydanticとSchemaの使い方

FlaskのAPIでリクエストバリデーションを行う方法!schemaとpydanticの活用
FlaskのAPIでリクエストバリデーションを行う方法!schemaとpydanticの活用

先生と生徒の会話形式で理解しよう

生徒

「先生、FlaskでAPIを作ってるんですけど、入力されたデータをちゃんと確認する方法ってありますか?」

先生

「いい質問ですね。Flaskでは、Pydanticというライブラリを使うと、APIに送られてきたデータを簡単にチェックできますよ。」

生徒

「それって難しいですか?プログラミング初心者でもできますか?」

先生

「もちろんです!今日は、パソコン初心者でもわかるように、超やさしく説明していきますね。」

1. リクエストバリデーションとは?

1. リクエストバリデーションとは?
1. リクエストバリデーションとは?

リクエストバリデーションとは、ユーザーがフォームやAPIに送ってくるデータが正しいかをチェックする作業のことです。

たとえば「年齢」が「数字じゃない文字」だったり、「名前」が「空っぽ」だったらエラーにしたいですよね?それを自動でチェックするのが、バリデーション(検証)です。

2. Flaskとは?Pydanticとは?初心者向けに説明!

2. Flaskとは?Pydanticとは?初心者向けに説明!
2. Flaskとは?Pydanticとは?初心者向けに説明!

Flask(フラスク)は、Python(パイソン)というプログラミング言語で作られた、Webアプリケーションを簡単に作れるツールです。

Pydantic(パイダンティック)は、データの正しさをチェックするための道具(ライブラリ)です。「このデータは整数でなきゃダメ」とか「空っぽじゃダメ」とかを、簡単に指定できます。

3. Flask + PydanticでAPIを作ってバリデーションする方法

3. Flask + PydanticでAPIを作ってバリデーションする方法
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. 実行して確認してみよう

4. 実行して確認してみよう
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のスキーマで何ができるの?

5. Pydanticのスキーマで何ができるの?
5. Pydanticのスキーマで何ができるの?

スキーマとは、「データの設計図」です。どんな形のデータが送られてくるかを、あらかじめ決めておけるので、チェックがとても簡単です。

Pydanticを使えば、次のようなことが自動でできます:

  • 必須の項目があるかチェック
  • 文字か数字かなど、データの種類をチェック
  • エラーがあった場合、どこがおかしいか教えてくれる

6. よくある質問とエラー例

6. よくある質問とエラー例
6. よくある質問とエラー例

Q1: 入力が空っぽだったらどうなるの?

A1: 必須項目がないと、自動でエラーになります。たとえば「name」がなければ、次のように返ってきます。


{
    "error": "入力データに問題があります。",
    "details": [
        {
            "loc": ["name"],
            "msg": "field required",
            "type": "value_error.missing"
        }
    ]
}

Q2: エラーの内容が英語でわかりづらい…

A2: そうですね。初心者のうちはちょっと戸惑うかもしれませんが、Pydanticが「どの項目に」「どんなエラーがあるか」を丁寧に教えてくれてると思って見てみてください。

7. FlaskとPydanticを使うメリット

7. Flaskと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作りがもっと安全にできそうです!」

この記事を読んだ人からの質問

この記事を読んだ人からの質問
この記事を読んだ人からの質問

プログラミング初心者からのよくある疑問/質問を解決します

FlaskでAPIリクエストのバリデーションとは何ですか?

FlaskでAPIリクエストのバリデーションとは、ユーザーがAPIに送ってくるJSONデータが正しい形式かどうかをチェックする仕組みです。たとえば、年齢が数字かどうか、名前が空欄ではないかなどを事前に検証することで、アプリの安全性を高めます。
カテゴリの一覧へ
新着記事
New1
Flask
Flaskアプリの作り方を基礎から学ぼう!初心者が覚えるべき開発の流れとは?
New2
Flask
Flask-WTFでファイルアップロードフォームを完全ガイド!初心者でもわかる画像やPDFのアップロード方法
New3
Flask
FlaskでCSRF対策を実装する方法!安全なフォーム送信を学ぼう
New4
Python
Pythonの文字列型(str)を完全解説!連結・分割・検索の方法を紹介
人気記事
No.1
Java&Spring記事人気No1
Django
Django環境構築の全手順を完全解説!初心者でも迷わないPython・Djangoセットアップガイド
No.2
Java&Spring記事人気No2
Python
Pythonの文字列を1文字ずつ処理する方法!for文やlist化の活用例
No.3
Java&Spring記事人気No3
Flask
Flask-Loginでユーザー認証を完全ガイド!初心者でもわかるログイン処理の作り方
No.4
Java&Spring記事人気No4
Python
PythonでHello Worldを表示するには?初心者向けに最初の1行を実行してみよう
No.5
Java&Spring記事人気No5
Flask
FlaskアプリをNginx + Gunicornで本番運用する方法!初心者でもわかるデプロイ構成の基本
No.6
Java&Spring記事人気No6
Python
Pythonでリストを文字列に変換する方法を完全ガイド!初心者でもわかるjoinの使い方
No.7
Java&Spring記事人気No7
Python
Pythonで定数を定義する方法!変更されない変数の書き方と命名ルールを初心者向けに解説
No.8
Java&Spring記事人気No8
Flask
FlaskアプリのSECRET_KEYの設定方法を完全ガイド!初心者でもわかるセキュリティ対策