2014-09-24 5 views
1

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

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

Вот моя форма Войти код:

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 %} 

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

+0

Вы посмотрели на 'form.errors' после вызова' validate_on_submit'? – dirn

+0

Я распечатал form.errors, но ничего не появилось: \ – phouse512

+0

В вашем примере вы распечатываете * до *, вы фактически проверяете форму. У него не будет никаких ошибок, пока вы не попытаетесь его проверить. – dirn

ответ

2

форма = 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) 
1

Не инициализируйте LoginForm класс с request.form.

form = LoginForm() 
0

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

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