カテゴリ: Flask 更新日: 2026/01/02

Flask-WTFの使い方!フォームバリデーションを簡単にする拡張機能の導入手順

Flask-WTFの使い方!フォームバリデーションを簡単にする拡張機能の導入手順
Flask-WTFの使い方!フォームバリデーションを簡単にする拡張機能の導入手順

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

生徒

「Flaskで入力フォームを作ったら、空欄だったり間違った入力をチェックするのが大変そう…簡単にできる方法ってありますか?」

先生

「そのとおり。Flaskでは『Flask-WTF』という拡張機能を使うと、入力チェック(バリデーション)をとても簡単に行えるようになります。」

生徒

「Flask-WTFって、難しそうな名前ですね…。どうやって使うんですか?」

先生

「大丈夫ですよ。Flask-WTFを使えば、Pythonのコードだけでわかりやすくフォームを定義して、バリデーションも自動でやってくれるんです。ひとつずつ順番に説明していきましょう!」

1. Flask-WTFとは?

1. Flask-WTFとは?
1. Flask-WTFとは?

Flask-WTF(フラスク・ダブルティーエフ)は、PythonのWebフレームワークFlask(フラスク)でフォームを扱いやすくするための拡張機能(エクステンション)です。フォームの作成だけでなく、入力チェック(バリデーション)やエラー表示までをまとめて手伝ってくれる、便利な追加パーツだと思ってください。

Webアプリでは、名前やメールアドレス、問い合わせ内容などを入力してもらう「フォーム」がよく使われます。ところが、フォームには「必須項目が空欄のまま送信されてしまう」「メールアドレスの書き方が間違っている」といった問題がつきものです。こうした間違った入力を防ぐチェックのことをバリデーションと呼び、実はかなり重要な役割を持っています。

Flask-WTFを使うと、HTMLで一からフォームを組み立てなくても、Pythonのコードの中でフォームの項目とルールをまとめて定義できます。フォームの「設計図」をPythonで書いておくと、その設計図をもとにフォームが表示され、入力チェックも自動で行ってくれます。

たとえば、「名前を必ず入力してもらいたい」という、とてもシンプルなフォームのイメージは次のようになります。


from flask_wtf import FlaskForm
from wtforms import StringField
from wtforms.validators import DataRequired

class SimpleNameForm(FlaskForm):
    name = StringField('お名前', validators=[DataRequired()])

このサンプルでは、まずFlaskFormという「フォームの元になるクラス」を読み込み、StringFieldという文字入力用の部品、そしてDataRequiredという「空欄禁止」のルールを読み込んでいます。

SimpleNameFormクラスの中でnameという項目をひとつ定義し、「ラベルは『お名前』」「必ず何か入力されていないとエラーにする」というルールをセットしています。プログラミング未経験の方は、「フォームの項目とチェックの条件を、Pythonで宣言しておくもの」くらいのイメージを持っておけば大丈夫です。

実際には、このフォームクラスをFlaskのルートやテンプレートと組み合わせて使いますが、その具体的な書き方は次の章以降で順番に見ていきます。まずは「Flask-WTFは、Flaskでフォームを作りやすくし、入力チェックもまとめて任せられる便利な拡張機能なんだ」と理解しておきましょう。

2. Flask-WTFをインストールしよう

2. Flask-WTFをインストールしよう
2. Flask-WTFをインストールしよう

まずはFlask-WTFをインストールしましょう。コマンドプロンプトやターミナルに以下を入力してください。


pip install flask-wtf

このコマンドは「pip(ピップ)」というPythonの道具を使って、Flask-WTFという拡張機能をパソコンに追加するものです。

3. Flaskアプリの準備

3. Flaskアプリの準備
3. Flaskアプリの準備

フォームを使うには、まずFlaskアプリの基本的な構造が必要です。以下は簡単なFlaskアプリのコードです。


from flask import Flask, render_template, request
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequired

app = Flask(__name__)
app.secret_key = 'ひみつのキー'

secret_key(シークレットキー)は、セキュリティ上の理由で必要です。フォームの送信に使われる情報を守るための鍵のようなものです。

4. フォームを定義しよう

4. フォームを定義しよう
4. フォームを定義しよう

Flask-WTFでは、Pythonのクラスを使ってフォームを定義します。次のように書きます。


class NameForm(FlaskForm):
    name = StringField('お名前', validators=[DataRequired()])
    submit = SubmitField('送信')

StringField(ストリングフィールド)は文字列用の入力欄です。DataRequired()(データリクワイヤード)は「必ず入力してください」という意味のバリデーションです。

5. ルーティングとビュー関数を作ろう

5. ルーティングとビュー関数を作ろう
5. ルーティングとビュー関数を作ろう

次に、フォームを表示して、入力を受け取る処理をFlaskの関数で書きます。


@app.route('/', methods=['GET', 'POST'])
def index():
    form = NameForm()
    if form.validate_on_submit():
        return f"こんにちは、{form.name.data}さん!"
    return render_template('index.html', form=form)

validate_on_submit()は、フォームが正しく送信されたかどうかを確認する命令です。

6. HTMLテンプレートを作ろう

6. HTMLテンプレートを作ろう
6. HTMLテンプレートを作ろう

フォームの見た目を表示するためのHTMLファイルを作ります。Flaskではテンプレートという仕組みを使って、HTMLとPythonを組み合わせます。以下はtemplates/index.htmlの内容です。


<!doctype html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>お名前フォーム</title>
</head>
<body>
    <form method="post">
        {{ form.hidden_tag() }}
        <p>
            {{ form.name.label }}<br>
            {{ form.name(size=32) }}
        </p>
        <p>{{ form.submit() }}</p>
    </form>
</body>
</html>

form.hidden_tag()は、セキュリティ用の情報を自動で挿入してくれるタグです。

7. 入力チェックを試してみよう

7. 入力チェックを試してみよう
7. 入力チェックを試してみよう

ブラウザでページを開き、名前を入力せずに「送信」ボタンを押してみてください。エラーメッセージは表示されませんが、フォームは送信されず、入力が必要なことがわかります。

このように、Flask-WTFを使うとフォームのチェックが自動で行われ、Pythonだけで安全で簡単な入力フォームを作ることができます。

8. よく使うバリデーション

8. よく使うバリデーション
8. よく使うバリデーション

Flask-WTFでは、他にも色々なバリデーションが使えます。よく使うものを紹介します。

  • DataRequired():空欄を禁止
  • Email():正しいメールアドレス形式か確認
  • Length(min=4, max=20):文字数の範囲を指定

例えばメールアドレスの入力欄を作るなら、次のように書きます。


from wtforms import StringField
from wtforms.validators import Email

email = StringField('メールアドレス', validators=[DataRequired(), Email()])

9. なぜFlask-WTFを使うべきなの?

9. なぜFlask-WTFを使うべきなの?
9. なぜFlask-WTFを使うべきなの?

HTMLでフォームを書く方法もありますが、それでは入力チェックを自分でJavaScriptやPythonで書かなければなりません。

Flask-WTFを使えば、フォームの定義・表示・バリデーションのすべてをPythonだけでスッキリ書けます。コードの見通しも良くなり、セキュリティも高まります。

まとめ

まとめ
まとめ

Flaskでフォームを作成する際に欠かせない存在となる「Flask-WTF」は、フォームバリデーションを簡単かつ安全に実装するための拡張機能です。この記事では、Flask-WTFのインストール方法から、Pythonコードによるフォーム定義、ルーティング設定、テンプレートとの連携方法までを丁寧に紹介しました。

Flask-WTFを使うことで、HTMLで複雑な入力チェックコードを書くことなく、DataRequiredEmailLengthといったバリデーションをPython内で一元管理できます。特に、`validate_on_submit()`を使えば、送信と同時に自動でバリデーション処理が実行されるので、セキュリティやUX向上にもつながります。

実際にPythonコードとテンプレートを組み合わせて構築することで、動作の流れやフォーム送信の仕組みを視覚的にも理解できたことでしょう。以下に簡単なフォームの例を改めて記述しますので、実際に試してみるとより理解が深まります。

Pythonで定義するフォームクラス


from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequired, Email

class ContactForm(FlaskForm):
    name = StringField('お名前', validators=[DataRequired()])
    email = StringField('メールアドレス', validators=[DataRequired(), Email()])
    submit = SubmitField('送信')

HTMLテンプレート(templates/contact.html)


<form method="post">
    {{ form.hidden_tag() }}
    <p>{{ form.name.label }}<br>{{ form.name(size=32) }}</p>
    <p>{{ form.email.label }}<br>{{ form.email(size=32) }}</p>
    <p>{{ form.submit() }}</p>
</form>

このようにFlask-WTFを活用すれば、フォーム入力の精度と開発効率を高めることが可能です。
バリデーションルールもカスタマイズ可能なので、ユーザー登録やお問い合わせフォームなど、様々な用途に応用できます。

先生と生徒の振り返り会話

生徒

「Flask-WTFって最初は難しそうに感じたけど、Pythonだけでフォームが作れて、しかも自動で入力チェックもしてくれるのはすごく便利ですね!」

先生

「そうですね。Flask-WTFを使えば、開発のスピードも上がるし、セキュリティ面でも安心できます。フォーム処理に関するベストプラクティスといえますよ。」

生徒

「Emailのチェックや文字数の制限も簡単にできるし、テンプレートと組み合わせればすぐにWebアプリが作れそうです!」

先生

「その意気です。今回学んだFlask-WTFは、実践的なフォーム開発の第一歩として最適ですから、いろんな場面でどんどん使ってみてくださいね。」

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

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

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

Flask-WTFって何のために使うの?Flaskのフォーム作成とバリデーションの違いは?

Flask-WTFは、PythonのFlaskでフォームを作成する際に、簡単にバリデーション(入力チェック)機能を追加できる拡張機能です。Flask単体でもフォームは作れますが、入力チェックを自分で実装しなければなりません。Flask-WTFを使えば、フォームの定義から入力の検証までをPythonコードだけで効率的に行えます。

Flask-WTFのインストール方法は?pipの使い方も知りたい

Flask-WTFは、Pythonのパッケージ管理ツール「pip」を使ってインストールします。コマンドプロンプトやターミナルにpip install flask-wtfと入力することで、Flask-WTFをプロジェクトに導入できます。
カテゴリの一覧へ
新着記事
New1
Flask
FlaskでCookieを安全に使う方法!HttpOnly・Secureフラグの使い方を徹底解説
New2
Flask
Flask‑RESTfulでREST APIを構築する手順まとめ!初心者向けにやさしく解説
New3
Flask
Flaskで開発中にデータベースを初期化する方法!初心者でもわかる便利なTips
New4
Flask
Flaskとは何か?初心者向けにできること・特徴・インストール手順までやさしく解説
人気記事
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アプリの環境変数設定方法!安全で柔軟な構成を実現しよう
No.4
Java&Spring記事人気No4
Python
Pythonでリストをコピーする方法!copy()・スライス・list()の使い方を比較
No.5
Java&Spring記事人気No5
Django
DjangoとFlaskの違いを完全比較!初心者でもわかるPythonフレームワーク入門
No.6
Java&Spring記事人気No6
Flask
Flaskとは何か?初心者向けにできること・特徴・インストール手順までやさしく解説
No.7
Java&Spring記事人気No7
Python
Pythonのmatch文(パターンマッチング)とは?switch文の代替としての使い方をやさしく解説
No.8
Java&Spring記事人気No8
Python
Pythonで空白や不要な文字を削除する方法!strip(), rstrip(), lstrip() の使い方を初心者向けに解説