Flask WTForm 未验证,未报告表单错误
Posted
技术标签:
【中文标题】Flask WTForm 未验证,未报告表单错误【英文标题】:Flask WTForm not validating, no form errors reported 【发布时间】:2020-05-16 15:20:32 【问题描述】:我正在尝试使用一些由 flask-WTF 表单控制的基本登录/注册系统来设置一个 flask webapp。
这是我的代码:
html
<!-- Register form -->
<div class="form">
<div class="form-area">
<h2>Register</h2>
<form action=" url_for('register') ">
form.csrf_token()
form.hidden_tag()
form.name(placeholder='name')
form.surname(placeholder='surname')
form.email(placeholder='email')
form.password(placeholder='password')
form.confirm_password(placeholder='confirm password')
<input type="submit" value="Register">
</form>
<p>Already registered?<a href=" url_for('login') "> Log in here</a></p>
</div>
<div class="error-area">
% for error in form.confirm_password.errors %
<p> error </p>
% endfor %
</div>
</div>
类
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField
from wtforms.validators import InputRequired, Length, EqualTo
class RegisterForm(FlaskForm):
name = StringField('name', validators=[InputRequired()])
surname = StringField('surname', validators=[InputRequired()])
email = StringField('email', validators=[InputRequired()])
password = PasswordField('password', validators=[InputRequired(), Length(min=6)])
confirm_password = PasswordField('confirm passord', validators=[InputRequired(), Length(min=6), EqualTo(password)])
烧瓶
@app.route('/register')
def register():
#declare a register form
form = RegisterForm()
#validate form
if form.validate_on_submit():
print('validate')
return '<h1>Success</h1>'
else:
print('not validated')
print(form.errors)
return render_template('register.html', form=form)
我的代码的问题是验证似乎不起作用。即使我用“有效”输入填写表格,form.validate_on_submit()
总是失败。
我无法理解的是,即使我尝试打印数组错误,也没有显示错误。
我错过了什么?
【问题讨论】:
【参考方案1】:这里有几个问题。首先,在您的 html 中,您没有为表单设置method
属性。这意味着它默认为GET
,这就是表单不验证的原因。可以这样更改:
<form action=" url_for('register') " method='POST'>
顺便说一句,由于加载表单的视图与目标相同,您可以省略 action 属性,给我们:
<form method='POST'>
其次,在您的类中,confirm_password
字段存在一些问题。首先,您在PasswordField('confirm passord'
中有错字。其次,EqualTo()
验证器需要一个字符串,而不是一个字段。我们需要将此行全部更改为:
confirm_password = PasswordField('confirm password', validators=[InputRequired(), Length(min=6), EqualTo('password')])
最后,在您的 flask 中,我们需要接受 POST
对视图的请求。这可以通过更改 @app.route()
来完成:
@app.route('/register', methods=['POST', 'GET'])
进行这些更改后,表单应该可以按预期工作。
【讨论】:
以上是关于Flask WTForm 未验证,未报告表单错误的主要内容,如果未能解决你的问题,请参考以下文章
Flask:在另一个页面上使用WTForm,而不是渲染表单本身
Flask / WTF表单将变量传递给模板会产生500错误,表单未定义