flask-wtf validate_on_submit()

phoenixwu0229
  • 185

验证用户名和密码,validate_on_validate()返回值因为True,但是下面的代码却是False,求解答:

class LoginForm(Form):
    username = StringField('Username')
    password = PasswordField('Password')
    submit = SubmitField('Login')
    def validate_username(self, field):
        if field.data != 'you':
            raise ValidationError('Invalid username')
    def validate_password(self, field):
        if field.data != 'flask':
            raise ValidationError('Invalid password')
@app.route('/', methods=['POST', 'GET'])
def login_view():
    form = LoginForm()
    if form.validate_on_submit():
            flash('Username and password are correct')
            return redirect('/')
    return render_template('form.html', form = form)

如上form.validate_on_submit()返回值总是为False
我只能把代码改为:

@app.route('/', methods=['POST', 'GET'])
def login_view():
    form = LoginForm()
    if request.method == 'POST':
        if not form.validate_on_submit():
            flash('Username and password are correct')
            return redirect('/')
    else:
        return render_template('form.html', form = form)

这样才会有用,求解答

回复
阅读 11.5k
2 个回答

问题可能是因为你的表单里StringField和PasswordField没有validators,如果表单里没有写validators的话,相当于你提交的表单内容是空,后端的form.validate_on_submit()就会一直是false。
试试这种写法

username = StringField('Username',validators=[Required()])
password = PasswordField('Password',validators=[Required()])

如果你的username和password需要特殊格式的话,这里validators可能不只要写Required。我的登录验证表单是这样写的

email = StringField('Email',validators=[Required(),Length(1,64),Email()])
password = PasswordField('Password',validators=[Required()])

这里需要引入一些验证的包或者叫验证函数

from wtforms.validators import Required,Email

可以参考一下这里
http://stackoverflow.com/questions/20170234/validate-on-submit-always-returns-false-using-flask-wtforms

你上面的LoginForm类继承的是Form,改一下,改为继承FlaskForm试试:

from flask_wtf import FlaskForm

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏