Как различные объекты формы взаимодействуют в 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() с form = LoginForm()? Как эта совершенно новая форма когда-либо validate_on_submit()?


person Dramal    schedule 23.01.2015    source источник


Ответы (2)



Посмотрите на исходный код flask-wtf (я удалил несвязанные фрагменты и добавленные комментарии):

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.

person Bartosz Marcinkowski    schedule 23.01.2015