Flaskでのアプリケーション開発において、Jinjaテンプレートエンジンを使ってデータを表示し、WTFormsを利用してフォームを作成することは非常に一般的なアプローチです。これらを組み合わせることで、ユーザーインターフェースを効果的に作成し、データの入力・送信を簡単に管理することができます。本記事では、FlaskでJinjaテンプレートを使ってデータを表示し、WTFormsでフォームを操作する方法について完全かつ包括的に説明します。
1. Flaskのセットアップ
まず、Flaskをインストールする必要があります。以下のコマンドでインストールできます。

bashpip install Flask pip install Flask-WTF
Flask-WTFは、FlaskにWTFormsを統合するための拡張機能です。これにより、Flaskアプリケーションで簡単にフォームを作成し、バリデーションを行うことができます。
2. アプリケーションの初期設定
Flaskアプリケーションを作成し、基本的なセットアップを行います。以下のコードをapp.py
という名前のファイルに保存します。
pythonfrom flask import Flask, render_template, request, redirect, url_for
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequired
app = Flask(__name__)
app.config['SECRET_KEY'] = 'mysecretkey' # CSRF保護のためのシークレットキー
# フォームクラスの定義
class MyForm(FlaskForm):
name = StringField('名前', validators=[DataRequired()])
submit = SubmitField('送信')
# ルートの定義
@app.route('/', methods=['GET', 'POST'])
def index():
form = MyForm()
if form.validate_on_submit():
# フォームが送信され、有効な場合
name = form.name.data
return redirect(url_for('success', name=name))
return render_template('index.html', form=form)
@app.route('/success')
def success():
name = request.args.get('name')
return f'こんにちは、{name}さん!'
if __name__ == '__main__':
app.run(debug=True)
このコードでは、Flaskアプリケーションを作成し、/
ルートでフォームを表示し、送信されたデータを処理しています。また、success
ルートでは、フォームで入力された名前を表示しています。
3. Jinjaテンプレートでフォームの表示
次に、Jinjaテンプレートを使ってフォームを表示します。templates
フォルダを作成し、その中にindex.html
というファイルを作成します。
htmlhtml>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>Flaskアプリケーションtitle>
head>
<body>
<h1>名前を入力してくださいh1>
<form method="POST">
{{ form.hidden_tag() }}
<div>
<label for="name">名前label>
{{ form.name() }}
div>
<div>
{{ form.submit() }}
div>
form>
body>
html>
このHTMLコードでは、Flask-WTFフォームのフィールドをJinjaを使って描画しています。{{ form.name() }}
のように、Flask-WTFのフォームフィールドをテンプレート内に表示することができます。また、form.hidden_tag()
を使って、CSRF保護のための隠しフィールドを自動的に追加します。
4. フォームのバリデーション
Flask-WTFを使用すると、フォームのバリデーションが非常に簡単に行えます。DataRequired
のようなバリデータを使って、入力必須フィールドを定義できます。上記のコードでは、name
フィールドにDataRequired
バリデータを設定しており、このフィールドが空であってはならないことを示しています。
もしフォームが送信されたときにバリデーションエラーがあれば、エラーメッセージがフォームの下に表示されます。エラーメッセージは以下のようにテンプレート内で表示できます。
html<div>
{% for error in form.name.errors %}
<p style="color:red;">{{ error }}p>
{% endfor %}
div>
これにより、name
フィールドにバリデーションエラーがあった場合、エラーメッセージが赤文字で表示されます。
5. フォームデータの取得と利用
フォームが正常に送信され、バリデーションに通った場合、form.name.data
を使ってフォームに入力されたデータを取得することができます。これを使って、データベースに保存したり、他のビューに渡したりすることができます。
上記のコードでは、フォームが送信されると、入力された名前をredirect
で/success
ルートに渡し、そこではその名前を表示しています。
6. 複数のフォームの取り扱い
Flask-WTFでは、複数のフォームを同時に処理することも可能です。例えば、1ページに複数のフォームを表示し、それぞれを個別に処理することができます。以下にその例を示します。
pythonclass FormA(FlaskForm):
field_a = StringField('フィールドA', validators=[DataRequired()])
submit_a = SubmitField('送信A')
class FormB(FlaskForm):
field_b = StringField('フィールドB', validators=[DataRequired()])
submit_b = SubmitField('送信B')
@app.route('/', methods=['GET', 'POST'])
def index():
form_a = FormA()
form_b = FormB()
if form_a.validate_on_submit():
return redirect(url_for('success', name=form_a.field_a.data))
if form_b.validate_on_submit():
return redirect(url_for('success', name=form_b.field_b.data))
return render_template('index.html', form_a=form_a, form_b=form_b)
このコードでは、2つのフォームFormA
とFormB
を定義し、それぞれのフォームを処理しています。それぞれの送信ボタンに対応するフォームが送信されると、適切なルートにリダイレクトされます。
7. まとめ
FlaskとJinja、WTFormsを組み合わせることで、効率的にユーザーインターフェースを作成し、フォームの入力を簡単に処理できます。Flask-WTFを使うことで、フォームのバリデーションやCSRF保護が自動的に行われ、安全で使いやすいアプリケーションを作成することができます。Jinjaテンプレートエンジンを使って、フォームのデータを簡単に表示することも可能です。このように、FlaskとJinja、WTFormsを活用することで、PythonでのWebアプリケーション開発がより効率的かつ効果的になります。