Форма Flask-WTF не получает данные

Я использую Flask-WTF для отправки формы, но у меня возникают некоторые трудности, и я не могу найти помощь или другие примеры. Мой код ниже, но вот что я нашел до сих пор. form.validate_on_submit () не оценивается как истина, поэтому он пропускает весь этот блок. Затем я попытался посмотреть, что происходит с запросом, прочитанным python. Когда я распечатал значение (после инициализации LoginForm) «form.username.data», он распечатал «None», так что кажется, что форма создается неправильно?

Я проверил почтовый запрос, который отправляет браузер, и вся необходимая информация видна в этом запросе!

Вот мой код формы входа:

   from flask.ext.wtf import Form
      from wtforms import TextField, PasswordField
      from wtforms.validators import Required

     class LoginForm(Form):
      username = TextField('username', validators = [Required()])
      pin = PasswordField('pin', validators = [Required()])

Вот логика маршрута:

@app.route('/login', methods = ['GET', 'POST'])
def login():

    if g.user is not None and g.user.is_authenticated():
        return redirect(url_for('index'))


    form = LoginForm(request.form)

    print form.errors

    if form.validate_on_submit():
        if form.username is None or form.username == "":
            print "invalid user"
            flash('Invalid login. Please try again.')
            return redirect(url_for('login'))
        user = db.session.query(User).filter_by(username=form.username).filter_by(password=form.pin).first()
        print user
        if user is None:
            flash('User does not exist. Please register.')
            return redirect(url_for('welcome'))

        login_user(user)
        return redirect(url_for('dashboard'))
    print "didn't validate"
    return render_template('login.html', title = 'Sign In', form = form)

код конфигурации:

CSRF_ENABLED = True

А вот форма HTML:

{% extends 'base.html' %}

{% block content %}
<h1>Sign In</h1>
<form action="" method="post" name="login">
    {{ form.hidden_tag()}}
    <p>
        Please enter your username:<br>
        {{ form.username }}<br>
    </p>
    <p>
        Please enter your pin:<br>
        {{ form.pin }}<br>
    </p>
    <p><input type="submit" value="Sign In"></p>
</form>
{% endblock %}

Я смотрел на это несколько дней, но не знаю, что делать дальше. Любые указатели или что-то очевидное, что мне не хватает?


person phouse512    schedule 24.09.2014    source источник
comment
Вы смотрели form.errors после звонка validate_on_submit?   -  person dirn    schedule 24.09.2014
comment
Я распечатал form.errors, но ничего не появилось: \   -  person phouse512    schedule 24.09.2014
comment
В вашем примере вы распечатываете его перед фактической проверкой формы. Никаких ошибок не будет, пока вы не попытаетесь его проверить.   -  person dirn    schedule 24.09.2014


Ответы (3)


form = LoginForm ()

и можно оптимизировать код следующим образом:

form = LoginForm() if request.method == 'POST' else LoginForm(request.args)
if form.validate_on_submit():
    if login_user(form.user, remember=form.remember_me.data) is True:
        flash(_('Logged in successfully.'))
    return redirect(form.next.data or url_for('index'))
return render_template('users/login.html', form=form)
person sergelab    schedule 24.09.2014

Не инициализируйте класс LoginForm с помощью request.form.

form = LoginForm()
person Mehdi Sadeghi    schedule 24.09.2014

Убедитесь, что вы поместили csrf_token внутри формы, если вы используете flask-WTF:

<form method="POST" action="<page for action>">
    {{ name-of-form.csrf_token }}
    ....
    {{ wtf.form_field(name-of-form.name-of-submit-button) }}
</form>
person A Mind    schedule 04.06.2017