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) |
不要使用
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> |