Flask-WTFの使い方!フォームバリデーションを簡単にする拡張機能の導入手順
生徒
「Flaskで入力フォームを作ったら、空欄だったり間違った入力をチェックするのが大変そう…簡単にできる方法ってありますか?」
先生
「そのとおり。Flaskでは『Flask-WTF』という拡張機能を使うと、入力チェック(バリデーション)をとても簡単に行えるようになります。」
生徒
「Flask-WTFって、難しそうな名前ですね…。どうやって使うんですか?」
先生
「大丈夫ですよ。Flask-WTFを使えば、Pythonのコードだけでわかりやすくフォームを定義して、バリデーションも自動でやってくれるんです。ひとつずつ順番に説明していきましょう!」
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をインストールしよう
まずはFlask-WTFをインストールしましょう。コマンドプロンプトやターミナルに以下を入力してください。
pip install flask-wtf
このコマンドは「pip(ピップ)」というPythonの道具を使って、Flask-WTFという拡張機能をパソコンに追加するものです。
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. フォームを定義しよう
Flask-WTFでは、Pythonのクラスを使ってフォームを定義します。次のように書きます。
class NameForm(FlaskForm):
name = StringField('お名前', validators=[DataRequired()])
submit = SubmitField('送信')
StringField(ストリングフィールド)は文字列用の入力欄です。DataRequired()(データリクワイヤード)は「必ず入力してください」という意味のバリデーションです。
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テンプレートを作ろう
フォームの見た目を表示するための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. 入力チェックを試してみよう
ブラウザでページを開き、名前を入力せずに「送信」ボタンを押してみてください。エラーメッセージは表示されませんが、フォームは送信されず、入力が必要なことがわかります。
このように、Flask-WTFを使うとフォームのチェックが自動で行われ、Pythonだけで安全で簡単な入力フォームを作ることができます。
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を使うべきなの?
HTMLでフォームを書く方法もありますが、それでは入力チェックを自分でJavaScriptやPythonで書かなければなりません。
Flask-WTFを使えば、フォームの定義・表示・バリデーションのすべてをPythonだけでスッキリ書けます。コードの見通しも良くなり、セキュリティも高まります。
まとめ
Flaskでフォームを作成する際に欠かせない存在となる「Flask-WTF」は、フォームバリデーションを簡単かつ安全に実装するための拡張機能です。この記事では、Flask-WTFのインストール方法から、Pythonコードによるフォーム定義、ルーティング設定、テンプレートとの連携方法までを丁寧に紹介しました。
Flask-WTFを使うことで、HTMLで複雑な入力チェックコードを書くことなく、DataRequiredやEmail、Lengthといったバリデーションを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は、実践的なフォーム開発の第一歩として最適ですから、いろんな場面でどんどん使ってみてくださいね。」