关于python:Flask-WTF表单没有获取数据

Flask-WTF form not getting data

我正在使用Flask-WTF提交表单,但我遇到了一些困难,我似乎无法找到任何帮助或其他示例。 我的代码如下,但这是我到目前为止所发现的。 form.validate_on_submit()未评估为true,因此它正在跳过整个块。 接下来,我试着看看python读取的请求发生了什么。 当我打印出"form.username.data"的值(在我初始化LoginForm之后)时,它打印出"None",所以看起来表单没有正确创建?

我检查了浏览器发送的帖子请求,并且该请求中的所有信息都可见!

这是我的登录表单代码:

1
2
3
4
5
6
7
   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()])

这是路线逻辑:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
@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)

配置代码:

1
CSRF_ENABLED = True

这是HTML表单:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{% extends 'base.html' %}

{% block content %}
Sign In
<form action="" method="post" name="login">
    {{ form.hidden_tag()}}
    <p>

        Please enter your username:
        {{ form.username }}
   
</p>
    <p>

        Please enter your pin:
        {{ form.pin }}
   
</p>
    <p>
<input type="submit" value="Sign In">
</p>
</form>
{% endblock %}

我已经看了好几天了,但我不知道接下来要做什么。 任何指针或任何明显我错过的东西?


form = LoginForm()

并可以如下优化代码:

1
2
3
4
5
6
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)

不要使用request.form初始化LoginForm类。

1
form = LoginForm()


如果您使用flask-WTF,请确保将csrf_token放在表单中:

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