[Flask-WTF]form.validate_on_submit()がなぜがFalseになる。

Python

概要

  • flaskでFormを作るときにFlask-WTFを使用した。
  • formのバリデーションチェックでform.validate_on_submit()が常にFalseで詰まった。
    • 正常な入力を行った場合でも、validate_on_submit()は常にFalse
    • 異常な入力を行った場合は、もちろんFalse
Flask-WTF
FlaskWTF

原因

  • {{form.csrf_token}}を含めずに行っていたため、Falseになっていた。
    <div class="form-wrapper">
      <h2 class="title">TestCase</h2>

      <form method="POST" action="{{ url_for('test_page') }}">
          {{ render_field(form.name) }}
          {{ render_field(form.intfield) }}
          {{ render_field(form.fileupload) }}
          {{ form.submit }}
      </form>
    </div>
  • 4行目を追加することで、解決した。
    <div class="form-wrapper">
      <h2 class="title">TestCase</h2>
      <form method="POST" action="{{ url_for('test_page') }}">
          {{ form.csrf_token }}  {# これが必要 #}
          {{ render_field(form.name) }}
          {{ render_field(form.intfield) }}
          {{ render_field(form.fileupload) }}
          {{ form.submit }}
      </form>
    </div>

ソースコード

test.html
{% extends 'layout.html' %}
{% from "_formhelpers.html" import render_field %}

{% block content %}
    <div class="form-wrapper">
      <h2 class="title">TestCase</h2>
      <form method="POST" action="{{ url_for('test_page') }}">
          {{ form.csrf_token }}
          {{ render_field(form.name) }}
          {{ render_field(form.intfield) }}
          {{ render_field(form.fileupload) }}
          {{ form.submit }}
      </form>
    </div>
{% endblock %}
_formhelpers.html
{% macro render_field(field) %}
    <fieldset class="form-field">
        {{ field.label }}
        {{ field(**kwargs)|safe }}
        {% if field.errors %}
            <ul class="errors">
                {% for error in field.errors %}
                    <li>{{ error }}</li>
                {% endfor %}
            </ul>
        {% endif %}
    </fieldset>
{% endmacro %}
app.py
@app.route('/test-case',methods=["GET","POST"])
def test_page():
    """Standard `contact` form."""
    form = TestForm()
    if form.validate_on_submit():
        return redirect(url_for("success"))
    return render_template(
        'test-case.html',
        form=form,
        template="form-template"
    )

class TestForm(FlaskForm):
    intfield = wtforms.IntegerField('intfield',
                                    validators=[validators.NumberRange(min=0,max=12)])

    fileupload = wtforms.FileField('file',validators=[DataRequired(),
                                                      FileAllowed('csv',message='dame')])

    name = wtforms.StringField('name',
                               validators=[DataRequired()])

    submit = SubmitField('OK')

参考

Flask-WTF - validate_on_submit() is never executed
I'm using Flask-WTF: Here is my form: from flask.ext.wtf import Form, TextField class BookNewForm(Form): name = TextField('Name') Here is the controller...

コメント

タイトルとURLをコピーしました