不同的Form对象如何在Flask-wtforms中进行通信?

时间:2015-01-23 13:27:30

标签: python flask wtforms flask-wtforms

典型的观点类似于

@app.route('/login', methods=['GET', 'POST'])
def login():
    form = LoginForm()
    if form.validate_on_submit():
        # do stufff
        return redirect(url_for('somewhere_else', param=param))
    return render_template('login.html', form=form)

我感到困惑的是:在调用login()视图时,是否有LoginForm()用[{1}}实例化的新form = LoginForm()?这种全新形式如何validate_on_submit()

2 个答案:

答案 0 :(得分:3)

quick-start guide in the documentation

的第一页中解决了这个问题
  

请注意,您不必将request.form传递给Flask-WTF;它会自动加载。方便的validate_on_submit将检查它是否是POST请求以及它是否有效。

因此,当您实例化表单时,如果可以,它将自动加载现有请求。

答案 1 :(得分:3)

查看flask-wtf的{​​{3}}(我删除了无关的片段并添加了评论):

class Form(SecureForm):

    # ...

    def __init__(self, formdata=_Auto, obj=None, prefix='', csrf_context=None,
                 secret_key=None, csrf_enabled=None, *args, **kwargs):

        # ...

        if formdata is _Auto:
            if self.is_submitted():
                formdata = request.form  # !!! LOOK HERE !!!
                if request.files:
                    formdata = formdata.copy()
                    formdata.update(request.files)
                elif request.json:
                    formdata = werkzeug.datastructures.MultiDict(request.json)
            else:
                formdata = None

        # ...

因此,如果您没有明确地将formdata传递给表单的构造函数,那么当前的请求就会被提交"" (该方法是PUT或POST),它使用request.form