所以我在一个html页面上有一个登录表单和注册表单。我的注册表单的自定义验证器不起作用。 routes.py如下所示
@app.route("/", methods=['GET', 'POST'])
def home():
login_form = LoginForm(request.form, prefix="login-form")
regis_form = RegistrationForm(request.form, prefix="register-form")
return render_template('home.html', login_form=login_form, regis_form=regis_form)
@app.route("/register", methods=['POST'])
def register():
regis_form = RegistrationForm(request.form, prefix='register-form')
if regis_form.validate_on_submit():
hashed_password = bcrypt.generate_password_hash(regis_form.password_regis.data).decode('utf-8')
user = User(username=regis_form.username_regis.data, email=regis_form.email_regis.data, password=hashed_password)
db.session.add(user)
db.session.commit()
flash('Your account has been created! You are now able to log in', 'success')
return redirect(url_for('home'))
return redirect(url_for('home'))
@app.route("/login", methods=['POST'])
def login():
login_form = LoginForm(request.form, prefix='login-form')
if login_form.validate_on_submit():
user = User.query.filter_by(email=login_form.email_login.data).first()
if user and bcrypt.check_password_hash(user.password, login_form.password_login.data):
login_user(user, remember=login_form.remember.data)
next_page = request.args.get('next')
return redirect(next_page) if next_page else redirect(url_for('home'))
else:
flash('Login Unsuccessful. Please check email and password', 'danger')
return redirect(url_for('home'))
forms.py
class RegistrationForm(FlaskForm):
username_regis = StringField('Username',
validators=[DataRequired(), Length(min=5, max=20)])
email_regis = EmailField('Email',
validators=[DataRequired(), Email()])
password_regis = PasswordField('Password', validators=[DataRequired()])
submit_regis = SubmitField('Sign Up')
def validate_username_regis(self, username_regis):
user = User.query.filter_by(username=username_regis.data).first()
if user:
raise ValidationError('That username is taken. Please choose a different one.')
def validate_email_regis(self, email_regis):
user = User.query.filter_by(email=email_regis.data).first()
if user:
raise ValidationError('That email is taken. Please choose a different one.')
class LoginForm(FlaskForm):
email_login = EmailField('Email',
validators=[DataRequired(), Email()])
password_login = PasswordField('Password', validators=[DataRequired()])
remember = BooleanField('Remember Me')
submit_login = SubmitField('Login')
home.html
<div>
<form method="POST" action="{{ url_for('login') }}">
{{ login_form.hidden_tag() }}
<fieldset class="form-group">
<div class="form-group">
{% if login_form.email_login.errors %}
{{ login_form.email_login(class="form-control is-invalid") }}
<div class="invalid-feedback">
{% for error in login_form.email_login.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ login_form.email_login(class="form-control mb-2", placeholder="Email") }}
{% endif %}
</div>
<div class="form-group">
{% if login_form.password_login.errors %}
{{ login_form.password_login(class="form-control is-invalid") }}
<div class="invalid-feedback">
{% for error in login_form.password_login.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ login_form.password_login(class="form-control mb-2", placeholder="Password") }}
{% endif %}
</div>
</fieldset>
<div class="form-group">
{{ login_form.submit_login(class="btn btn-danger") }}
</div>
</form>
</div>
<div class="" id="regis">
<form method="POST" action="{{ url_for('register') }}">
{{ regis_form.hidden_tag() }}
<fieldset class="form-group">
<div class="form-group">
{% if regis_form.username_regis.errors %}
{{ regis_form.username_regis(class="form-control form-control-md is-invalid") }}
<div class="invalid-feedback">
{% for error in regis_form.username_regis.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ regis_form.username_regis(class="form-control form-control-md mb-2", placeholder="Username") }}
{% endif %}
</div>
<div class="form-group">
{% if regis_form.email_regis.errors %}
{{ regis_form.email_regis(class="form-control form-control-md is-invalid") }}
<div class="invalid-feedback">
{% for error in regis_form.email_regis.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ regis_form.email_regis(class="form-control form-control-md mb-2", placeholder="Email") }}
{% endif %}
</div>
<div class="form-group">
{% if regis_form.password_regis.errors %}
{{ regis_form.password_regis(class="form-control form-control-md is-invalid") }}
<div class="invalid-feedback">
{% for error in regis_form.password_regis.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ regis_form.password_regis(class="form-control form-control-md mb-2", placeholder="Password") }}
{% endif %}
</div>
</fieldset>
<div class="form-group">
{{ regis_form.submit_regis(class="btn btn-danger") }}
</div>
</form>
</div>
以前我在同一主页路径上有两个表单,自定义验证器正在工作,但是如果我故意提交了带有错误的注册表单,那么登录表单也会显示错误,如需要输入。为了解决这个问题,我做了这个,但现在注册表单并没有验证自定义验证器
数据验证失败后,执行
return redirect(url_for('home'))
。这将导致回家路线上出现GET
。它填充表单的新实例:regis_form = RegistrationForm(request.form, prefix="register-form")
。您的错误信息将丢失,它位于不同的实例上要获取错误信息,您的
register()
路由需要使用render
模板,而不是执行重定向。不要忘记创建LoginForm
的新实例,否则渲染将失败相关问题 更多 >
编程相关推荐