WTFormsを使用したフォーム検証
ブラウザビューによって送信されたフォームデータを操作する必要がある場合、コードはすぐに非常に読みにくくなります。 このプロセスを管理しやすくするために設計されたライブラリがあります。 そのうちの1つは、ここで処理する WTForms です。 多くのフォームがある状況にある場合は、試してみることをお勧めします。
WTFormsを使用する場合は、最初にフォームをクラスとして定義する必要があります。 そのために、アプリケーションを複数のモジュール(より大きなアプリケーション)に分割し、フォーム用に個別のモジュールを追加することをお勧めします。
拡張機能を使用してWTFormsを最大限に活用する
Flask-WTF 拡張機能はこのパターンを拡張し、フォームとFlaskの操作をより楽しくするいくつかの小さなヘルパーを追加します。 PyPI から入手できます。
フォーム
これは、一般的な登録ページのフォームの例です。
from wtforms import Form, BooleanField, StringField, PasswordField, validators
class RegistrationForm(Form):
username = StringField('Username', [validators.Length(min=4, max=25)])
email = StringField('Email Address', [validators.Length(min=6, max=35)])
password = PasswordField('New Password', [
validators.DataRequired(),
validators.EqualTo('confirm', message='Passwords must match')
])
confirm = PasswordField('Repeat Password')
accept_tos = BooleanField('I accept the TOS', [validators.DataRequired()])
ビューで
ビュー関数では、このフォームの使用法は次のようになります。
@app.route('/register', methods=['GET', 'POST'])
def register():
form = RegistrationForm(request.form)
if request.method == 'POST' and form.validate():
user = User(form.username.data, form.email.data,
form.password.data)
db_session.add(user)
flash('Thanks for registering')
return redirect(url_for('login'))
return render_template('register.html', form=form)
ここでは、ビューがSQLAlchemy( FlaskのSQLAlchemy )を使用していることを示唆していることに注意してください。ただし、もちろん、これは必須ではありません。 必要に応じてコードを適合させます。
覚えておくべきこと:
- データがHTTP
POST
メソッドを介して送信される場合は、リクエストform
値からフォームを作成し、データがGET
として送信される場合はargs
を作成します。 - データを検証するには、
validate()
メソッドを呼び出します。このメソッドは、データが検証された場合はTrue
を返し、そうでない場合はFalse
を返します。 - フォームから個々の値にアクセスするには、 形。 。データ 。
テンプレートのフォーム
次に、テンプレート側に移動します。 フォームをテンプレートに渡すと、そこで簡単にレンダリングできます。 次のサンプルテンプレートを見て、これがいかに簡単かを確認してください。 WTFormsは、すでにフォーム生成の半分を実行しています。 さらに便利にするために、ラベル付きのフィールドと、エラーがある場合はそのリストをレンダリングするマクロを作成できます。
このようなマクロを使用した_formhelpers.html
テンプレートの例を次に示します。
{% macro render_field(field) %}
<dt>{{ field.label }}
<dd>{{ field(**kwargs)|safe }}
{% if field.errors %}
<ul class=errors>
{% for error in field.errors %}
<li>{{ error }}</li>
{% endfor %}
</ul>
{% endif %}
</dd>
{% endmacro %}
このマクロは、WTFormのフィールド関数に転送されるいくつかのキーワード引数を受け入れます。これにより、フィールドがレンダリングされます。 キーワード引数はHTML属性として挿入されます。 したがって、たとえば、render_field(form.username, class='username')
を呼び出して、入力要素にクラスを追加できます。 WTFormsは標準のPythonUnicode文字列を返すため、このデータは|safe
フィルターで既にHTMLエスケープされていることをJinja2に通知する必要があることに注意してください。
上記で使用した関数のregister.html
テンプレートは、_formhelpers.html
テンプレートを利用しています。
{% from "_formhelpers.html" import render_field %}
<form method=post>
<dl>
{{ render_field(form.username) }}
{{ render_field(form.email) }}
{{ render_field(form.password) }}
{{ render_field(form.confirm) }}
{{ render_field(form.accept_tos) }}
</dl>
<p><input type=submit value=Register>
</form>
WTFormsの詳細については、 WTFormsのWebサイトにアクセスしてください。