Flask-WTF не обрабатывает мою форму ответа - PullRequest
0 голосов
/ 20 октября 2011

Я использую Flask (версия 0.8) и Flask-WTF (версия 0.5.2) (например, для разбора форм), чтобы сделать довольно простой сайт.Однако я не могу заставить Flask-WTF правильно проанализировать результаты GET.

Мой соответствующий код выглядит следующим образом:

@app.route("/result", methods=("GET", "POST"))
def submit():
    form = MyForm()
    print request.args
    print request.args.get('aws_id', None, type=str)
    print form.is_submitted()
    if form.validate_on_submit():
        flash('Success')
        aws_id = form.aws_id.data
    return render_template("index.html", form=form)

Если я отправляю свою форму с одним полем с именем'aws_id' с GET Я получаю следующий вывод на консоли.

127.0.0.1 - - [19/Oct/2011 22:28:59] "GET /result?aws_id=test_string HTTP/1.1" 200 -
ImmutableMultiDict([('aws_id', u'test_string')])
test_string
False

Мне кажется, что отправка работает правильно, но Flask-WTF не работает.По сути, старый способ работы с выводом формы работает, метод request.args.get, но новые form.is_submitted и form.validate_on_submit не делают своего волшебного добра.

Есть идеи?(WTF!)

Ответы [ 2 ]

2 голосов
/ 11 июня 2013

Метод Form класса is_submitted Flask-WTF выглядит следующим образом:

def is_submitted(self):
    """
    Checks if form has been submitted. The default case is if the HTTP
    method is **PUT** or **POST**.
    """

    return request and request.method in ("PUT", "POST")

И в его __init__ есть такой код, который обычно обеспечивает автоматическую загрузку форм-данных из запроса Flask:

    if formdata is _Auto:
        if self.is_submitted():
            formdata = request.form

Так что понятно ... если вы отправляете форму через GET, вы не получаете ничего хорошего из автоматического поведения.Это понятно, потому что, если это запрос GET, неясно, была ли отправлена ​​форма или вы просто загружали страницу.Это исключает любые проблемы с CSRF.

validate_on_submit также не работает, так как он также опирается на is_submitted

Сам Flask также не разбирает поля GET в request.form для вас.

В конечном итоге вы должны сделать что-то вроде:

form = MyForm(request.args, csrf_enabled=False)
if 'aws_id' in request.args and form.validate():
    flash('Success')
    aws_id = form.aws_id.data

(все предполагают, что ваш класс MyForm наследуется от from flask.ext.wtf import Form)

2 голосов
/ 20 октября 2011

Я переместил свое приложение в корень моего сайта, удалил то, что было там (= избыточно), и добавил request.form в класс MyForm. Это, кажется, исправить это. Также необходимо было установить csrf_enabled в false.

@app.route("/", methods=("GET", "POST"))
def submit():
    form = MyForm(request.form, csrf_enabled=False)
    if form.validate_on_submit():
        print form.data

    return render_template("index.html", form=form)
...