プログラミング

【Python】Flask-WTFを使ってみよう③

投稿日:2021年1月3日 更新日:

前回「Flask-WTF」を使って「フォーム」の作成を行いました。
今回は「文字数」の入力を制限する「バリデーション」を設定していきたいと思います。

バリデーションを設定してみよう

バリデーションについてはこちら。

from flask import Flask, render_template
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField

app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret'

class LoginForm(FlaskForm):
   username = StringField('ユーザー名')
   password = PasswordField('パスワード')

@app.route('/form', methods=['GET', 'POST'])
def form():
   form = LoginForm()
   if form.validate_on_submit():
      return '<h1>ユーザー名は {}. パスワードは {}.'.format(form.username.data, form.password.data)
   return render_template('form.html', form=form)

if __name__ == "__main__":
   app.run(debug=True)

前回までのコードを置いておきます。

前回の記事はこちら。

「InputRequired」をインポートしよう

「wtforms.validators」から「InputRequired」をインポートしてきます。

from flask import Flask, render_template
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField

-------------------------------------------------
from wtforms.validators import InputRequired
-------------------------------------------------

app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret'

class LoginForm(FlaskForm):
   username = StringField('ユーザー名')
   password = PasswordField('パスワード')

@app.route('/form', methods=['GET', 'POST'])
def form():
   form = LoginForm()
   if form.validate_on_submit():
      return '<h1>ユーザー名は {}. パスワードは {}.'.format(form.username.data, form.password.data)
   return render_template('form.html', form=form)

if __name__ == "__main__":
   app.run(debug=True)

バリデーションの中身を記述しよう

まずは「ユーザー名」にバリデーションを設定します。

追記するもの
  1. 「forms.py」に「validators=[InputRequired()]」を追加
  2. 「form.html」に「{% for %}」と「{% end for %}」を追加

1.「forms.py」

from flask import Flask, render_template
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField
from wtforms.validators import InputRequired

app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret'


-------------------------------------------------
class LoginForm(FlaskForm):
   username = StringField('ユーザー名',  validators=[InputRequired()])
   password = PasswordField('パスワード')
-------------------------------------------------


@app.route('/form', methods=['GET', 'POST'])
def form():
   form = LoginForm()
   if form.validate_on_submit():
      return '<h1>ユーザー名は {}. パスワードは {}.'.format(form.username.data, form.password.data)
   return render_template('form.html', form=form)

if __name__ == "__main__":
   app.run(debug=True)

2.「form.html」

<html>
   <head>
   <title>TestForm</title>
  </head>
  <body>
     <h1>入力フォーム</h1>
     <form method="POST" action="{{ url_for('form') }}">
        {{ form.csrf_token }}
        {{ form.username.label }}
        {{ form.username }}


----------------------------------------
        <div>
           {% for error in form.username.errors %}
           <span style="color: red;">{{ error }}</span>
           {% endfor %}
        </div>
----------------------------------------


        {{ form.password.label }}
        {{ form.password }}
        <input type="submit" value="送信">
     </form>
  </body>
</html>

それぞれ追記しました。
確認してみましょう。

サーバーにアクセスして確認しよう

「localhost:5000/form」にアクセスします。

何も入力せずに「送信」を押すと、このような表示が出るはずです。

文字数を規定してみよう

文字数を規定するには「Length」をインポートしてあげましょう。
そして「validators = ~ 」の後ろに「Length」を追記していきます。

from flask import Flask, render_template
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField


------------------------------------------------------
from wtforms.validators import InputRequired, Length
------------------------------------------------------


app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret'


-------------------------------------------------------------------------
class LoginForm(FlaskForm):
   username = StringField('ユーザー名', validators=[InputRequired(), Length(min=8, max=16, message='8文字以上16文字以下で入力してください')])
   password = PasswordField('パスワード')
-------------------------------------------------------------------------


@app.route('/form', methods=['GET', 'POST'])
def form():
   form = LoginForm()
   if form.validate_on_submit():
      return '<h1>ユーザー名は {}. パスワードは {}.'.format(form.username.data, form.password.data)
   return render_template('form.html', form=form)

if __name__ == "__main__":
   app.run(debug=True)

文字数を「8文字以上16文字以下」に設定しました。
条件に合わない場合はエラーが表示されます。
では再度確認していきましょう。

「ANDo」では「4文字」なので、エラーが表示されるはずです。
それでは「送信」。

しっかり表示されました。

まとめ

今回は「文字数」をバリデーションしてみました。
次回は「パスワード」の方を設定していきたいですね。
ぜひ真似してみてください。
それではまた。

-プログラミング
-

執筆者:


  1. […] 【Python】Flask-WTFを使ってみよう③ […]

comment

メールアドレスが公開されることはありません。

関連記事

【Python】ログイン機能を作る「Flask-Login」⑨

「ログイン機能を作る」の【Part9】をやっていきます。前回は「新規アカウント作成」の「入力フォーム」と「バリデーション」を作りました。今回は残りの「テンプレートの作成(entry.html)」と「ア …

ローカル掲示板③

今回はローカル掲示板を作成した際に使用した関数を復習していきます。 関数の復習 isset ⇒ 変数がセットされているかをチェックします。     「isset($_POST[‘send& …

【Python】VBAをPythonで再現してみる②

前回に引き続き「VBA」の動きを「Python」で再現していきます。今回は、セルの値を「繰り返し」取得して行きたいと思います。 セルの値を繰り返し取得しよう 前回はセルの値を取得し、メッセージボックス …

【Python】セルに値を入力してみよう

今回は「openpyxl」を使って、セルに値を入力してみたいと思います。「openpyxl」について、「Excelファイルの読み込み方法」は、以前の記事をご覧ください。 openpyxlでセルに値を入 …

HTMLの要素

ほとんどのサイトがHTMLという言語で出来ており複数のコードによって作られていましたね。今回はコードの中身で使用される要素というものについて書いていきます。 要素の役割 コードを記述するうえで必要な知 …

YouTube