Flask-WTF - validate_on_submit() is never executed

flask, forms, python, validation, wtforms

Solution

You're not inserting the CSRF field in the HTML form.

<form method=post>
    {{ form.csrf_token }}
    {{ form.name }}
    <input type=submit>
</form>

After adding `form.csrf_token` to the template (docs), the form will validate as expected.

Add `print(form.errors)` after validating the form to see the errors that were raised. `errors` will be empty before validation. In this case, there is an error about missing

@book.route('/book/new_no_csrf', methods=['GET', 'POST'])
def customers_new_no_csrf():
    form = BookNewForm()
    print(form.errors)

    if form.is_submitted():
        print("submitted")

    if form.validate():
        print("valid")

    print(form.errors)

    if form.validate_on_submit():
        flash("Successfully created a new book")
        return redirect(url_for('.books_show'))

    return render_template('books_new.html', form=form)
{}
submitted
{'csrf_token': [u'CSRF token missing']}
127.0.0.1 - - [29/May/2012 02:01:08] "POST /book/new_no_csrf HTTP/1.1" 200 -
127.0.0.1 - - [29/May/2012 02:01:08] "GET /favicon.ico HTTP/1.1" 404 -

I created an example on GitHub.

Problem

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: ``` @book.route('/book/new', methods=['GET', 'POST']) def customers_new(): form = BookNewForm() if form.is_submitted(): print "submitted" if form.validate(): print "valid" if form.validate_on_submit(): flash("Successfully created a new book") return redirect(url_for('.books_show')) return render_template('views/books_new.html', form=form) ``` Now the problem is, if you look at my print statements, it always prints submitted, but it NEVER prints valid and validate_on_submit() is never executed. Why?

Original source