Вопрос по python, validation – Flask-WTF - validate_on_submit () никогда не выполняется

26

Я использую Flask-WTF:

Вот моя форма:

from flask.ext.wtf import Form, TextField

class BookNewForm(Form):
    name = TextField('Name')

Вот контроллер:

@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)

Теперь проблема в том, что если вы посмотрите на мои операторы печати, он всегда печатает отправленные, но НИКОГДА не печатает valid, а validate_on_submit () никогда не выполняется. Зачем?

Ссылка для подтверждения WTF. Сравните две даты, если начальная дата больше конечной, и выдайте ошибку.stackoverflow.com/a/53804438/9477847 Viraj.Hadoop

Ваш Ответ

6   ответов
2

вставьте это после тега в шаблон HTML-файла:

 {{ form.csrf_token }} 
1

Я очищал сеанс фляги, если я не входил в систему перед каждым запросом. Это было причиной этой проблемы.

@main.before_request
def before_request():
    if not current_user.is_authenticated():
        # TODO clean sessions may cause CSRF missing issue
        session.clear()
        print "Session Cleared"
        return redirect(url_for('auth.login'))
1

Я сталкивался с этим при попытке сделатьFormField повторяется над моимFieldList в моем шаблоне. Мне пришлось встроить два элемента hidden_tag один дляFieldList форма и один дляFieldForm Форма, поиск в шаблоне комментариев по ключевому слову & quot; HIDDEN TAG & quot;

class ParamRangeForm( FlaskForm ):
    minX = FloatField( )
    maxX = FloatField( )

class ParamRangesForm( FlaskForm ):
    paramRanges = FieldList( FormField( ParamRangeForm ) ,)
    submit      = SubmitField( 'Submit' )

    def loadParams( self ) :
        for paramName in ["p1" , "p2" , "p3", "p4"] :
            prf = ParamRangeForm( )
            prf.minX = -100.9#float('-inf')
            prf.maxX = 100.5#float('-inf')
            self.paramRanges.append_entry( prf )

...

  <form action="" method="POST" enctype="multipart/form-data">
    {{ rangesForm.hidden_tag() }} <!--#### HIDDEN TAG #1 -->
    <table>
      <!--Print Column Headers-->
      <thead>
      <tr>
        <th class="ColumnHeader">Parameter</td>
        <th class="ColumnHeader">Min</td>
        <th class="ColumnHeader">Max</td>
      </tr>
      </thead>

      <!--Print Parameter Rows-->
      <tbody>
      {% for paramRange in rangesForm.paramRanges %}
        <tr>
          {{ paramRange.hidden_tag() }} <!--#### HIDDEN TAG #2 -->
          <td>p{{ loop.index }}</td>
          <td>{{ paramRange.minX }}</td>
          <td>{{ paramRange.maxX }}</td>
        </tr>
      {% endfor %}
      </tbody>
    </table>
    </div>
    {{ rangesForm.submit() }}
  </form>
0

Я думаю, что API изменился. Возможно, попробуйте изменить

from flask.ext.wtf import Form

чтобы:

from flask_wtf import Form
11

вы можете распечатать ошибки

print form.errors

или же

app.logger.debug(form.errors)

и если вы получили csrf-error, вы должны установитьform.csrf_token в вашем шаблоне.

спасибо за эту подсказку, но "напечатайте form.errors" печатает {}. Тем не менее form.validate () возвращает False kadrian
Мне было интересно, как можно решить проблемы с проверкой формы Flask. Отлично
41

Вы не вставляете поле CSRF в форму HTML.

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

После добавленияform.csrf_token к шаблону (документы), форма будет подтверждена, как и ожидалось.

добавлять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)
{}
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 -

Я создал пример на GitHub.

Это давало мне кошмар. Большое спасибо.
Рад помочь. Если вы используете WTForms 0.6 или более поздней версии,form.csrf сталform.csrf_token так что следите за этим, ноform.hidden_tag() работает так же хорошо.
Интересно, почему эта важная часть отсутствует в документации? Спасибо!
Спасибо вам большое! Это была точная проблема! Я не включил поле csrf в мою форму. Пытаясь решить это с{{ form.csrf }} не работал, но делал:{{ form.hidden_tag() }} решил проблему! Вы также были правы насчет печати ошибок, приятно знать, как это работает правильно сейчас! kadrian

Похожие вопросы