Python form.validate_on_submit() 始终为假
Python form.validate_on_submit() always false
我正在使用 flask_wtf
这是我的登录表单
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, BooleanField, SubmitField
from wtforms.validators import DataRequired, Length
class LoginForm(FlaskForm):
username = StringField('Username', validators=[DataRequired()])
password = PasswordField('Password', validators=[DataRequired(), Length(8, 128)])
remember = BooleanField('Remember me')
submit = SubmitField('Log in')
这是我的 login.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>login</title>
</head>
<body>
<form method="POST" action="">
{{ form.csrf_token }}
{{ form.username.label }}<br>{{ form.username }}<br>
{{ form.password.label }}<br>{{ form.password }}<br>
{{ form.remember }}{{ form.remember.label }}<br>
{{ form.submit }}<br>
</form>
</body>
</html>
和我的app.py
from flask import Flask, render_template
from forms import LoginForm
app = Flask(__name__)
app.secret_key = 'learnflask'
@app.route('/login', methods=['GET', 'POST'])
def login():
form = LoginForm()
if form.validate_on_submit():
username = form.username.data
print(username)
return render_template('login.html', form=form)
if __name__ == '__main__':
app.run(debug=True)
我的问题是用户名不打印。似乎登录表单未提交,form.validate_on_submit() 是错误的。
form.validate_on_submit() 是错误的,因为您还没有将 request.form 对象添加到 LoginForm()
form = LoginForm(request.form)
对于 password
字段,您已将验证器设置为检查长度是否在 8 到 128 之间。如果用户提供的密码长度更小或更长,验证将失败。我认为这就是 form.validate_on_submit()
总是错误的原因。
我已经在模板中显示了错误信息并得到了错误。
login.html
:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>login</title>
<style>
.validation_error{
color: red;
}
</style>
</head>
<body>
<form method="POST" action="">
{{ form.csrf_token }}
{{ form.username.label }}<br>{{ form.username }}<span class="validation_error">{{ ', '.join(form.username.errors) }}</span><br>
{{ form.password.label }}<br>{{ form.password }}<span class="validation_error">{{ ', '.join(form.password.errors) }}</span><br>
{{ form.remember }}{{ form.remember.label }}<span class="validation_error">{{ ', '.join(form.remember.errors) }}</span><br>
{{ form.submit }}<br>
</form>
</body>
</html>
app.py
:
from flask import Flask, render_template
from forms import LoginForm
app = Flask(__name__)
app.secret_key = 'learnflask'
@app.route('/login', methods=['GET', 'POST'])
def login():
form = LoginForm()
if form.validate_on_submit():
username = form.username.data
return username
return render_template('login.html', form=form)
输出:
有效输入:
输入无效:
我正在使用 flask_wtf
这是我的登录表单
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, BooleanField, SubmitField
from wtforms.validators import DataRequired, Length
class LoginForm(FlaskForm):
username = StringField('Username', validators=[DataRequired()])
password = PasswordField('Password', validators=[DataRequired(), Length(8, 128)])
remember = BooleanField('Remember me')
submit = SubmitField('Log in')
这是我的 login.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>login</title>
</head>
<body>
<form method="POST" action="">
{{ form.csrf_token }}
{{ form.username.label }}<br>{{ form.username }}<br>
{{ form.password.label }}<br>{{ form.password }}<br>
{{ form.remember }}{{ form.remember.label }}<br>
{{ form.submit }}<br>
</form>
</body>
</html>
和我的app.py
from flask import Flask, render_template
from forms import LoginForm
app = Flask(__name__)
app.secret_key = 'learnflask'
@app.route('/login', methods=['GET', 'POST'])
def login():
form = LoginForm()
if form.validate_on_submit():
username = form.username.data
print(username)
return render_template('login.html', form=form)
if __name__ == '__main__':
app.run(debug=True)
我的问题是用户名不打印。似乎登录表单未提交,form.validate_on_submit() 是错误的。
form.validate_on_submit() 是错误的,因为您还没有将 request.form 对象添加到 LoginForm()
form = LoginForm(request.form)
对于 password
字段,您已将验证器设置为检查长度是否在 8 到 128 之间。如果用户提供的密码长度更小或更长,验证将失败。我认为这就是 form.validate_on_submit()
总是错误的原因。
我已经在模板中显示了错误信息并得到了错误。
login.html
:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>login</title>
<style>
.validation_error{
color: red;
}
</style>
</head>
<body>
<form method="POST" action="">
{{ form.csrf_token }}
{{ form.username.label }}<br>{{ form.username }}<span class="validation_error">{{ ', '.join(form.username.errors) }}</span><br>
{{ form.password.label }}<br>{{ form.password }}<span class="validation_error">{{ ', '.join(form.password.errors) }}</span><br>
{{ form.remember }}{{ form.remember.label }}<span class="validation_error">{{ ', '.join(form.remember.errors) }}</span><br>
{{ form.submit }}<br>
</form>
</body>
</html>
app.py
:
from flask import Flask, render_template
from forms import LoginForm
app = Flask(__name__)
app.secret_key = 'learnflask'
@app.route('/login', methods=['GET', 'POST'])
def login():
form = LoginForm()
if form.validate_on_submit():
username = form.username.data
return username
return render_template('login.html', form=form)
输出:
有效输入:
输入无效: