Flask-WTF - validate_on_submit()永远不会执行

kad*_*ian 29 python forms validation flask wtforms

我正在使用Flask-WTF:

这是我的表格:

from flask.ext.wtf import Form, TextField

class BookNewForm(Form):
    name = TextField('Name')
Run Code Online (Sandbox Code Playgroud)

这是控制器:

@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)
Run Code Online (Sandbox Code Playgroud)

现在的问题是,如果你查看我的print语句,它总是打印提交,但它永远不会打印有效,并且从不执​​行validate_on_submit().为什么?

小智 49

您没有在HTML表单中插入CSRF字段.

<form method=post>
    {{ form.csrf_token }}
    {{ form.name }}
    <input type=submit>
</form>
Run Code Online (Sandbox Code Playgroud)

添加form.csrf_token到模板(docs)后,表单将按预期验证.

print(form.errors)验证表单后添加以查看引发的错误. errors验证前将为空.在这种情况下,有一个关于遗漏的错误

@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)
Run Code Online (Sandbox Code Playgroud)
{}
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 -
Run Code Online (Sandbox Code Playgroud)

我在GitHub上创建了一个例子.

  • 非常感谢!这是确切的问题!我没有在表单中包含csrf字段.尝试使用`{{form.csrf}}`解决它并不起作用,但是:`{{form.hidden_​​tag()}}`解决了问题!您对错误打印也是对的,很高兴知道它现在如何正常工作! (4认同)

小智 13

你可以打印错误

print form.errors
Run Code Online (Sandbox Code Playgroud)

要么

app.logger.debug(form.errors)
Run Code Online (Sandbox Code Playgroud)

如果你有csrf-error,你应该在你的模板中设置form.csrf_token.

  • 感谢您的提示,但是 'print form.errors' 会打印 {} 。仍然 form.validate() 返回 False (2认同)