Flask wtforms 检查用户名是否已经存在/闪烁错误
Flask wtforms check if username already exists / flashing errors
我有一个基本的 registration/login 构建,可以按预期工作。我遇到的问题是我不知道如何检查用户名是否已被使用,然后闪现一条消息说明如此。
我的路线
@app.route("/signup", methods=['GET', 'POST'])
def signup():
form = RegisterForm()
if form.validate_on_submit():
hashed_password = generate_password_hash(form.password.data, method='sha256')
new_user = User(username=form.userName.data, email=form.email.data, password=hashed_password)
db.session.add(new_user)
db.session.commit()
flash("Registration successful...please log in!")
return redirect(url_for('login'))
return render_template("signup.html", form=form)
我的用户模型
class User(UserMixin, db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(20), unique=True)
email = db.Column(db.String(50), unique=True)
password = db.Column(db.String(80))
我的HTML(错误div)
{% for field, errors in form.errors.items() %}
<div class="alert alert-error">
{{ form[field].label }}: {{ ', '.join(errors) }}
</div>
{% endfor %}
一种可能性是编写一个 custom validator 查询数据库以查找具有该名称的现有用户,如果查询成功则抛出错误。
from flask_wtf import FlaskForm
from wtforms.validators import DataRequired
from wtforms.validators import ValidationError
class RegisterForm(FlaskForm):
# ...
username = StringField(
'Username',
validators=[
DataRequired(),
# ...
])
# ...
def validate_username(self, field):
if User.query.filter_by(username=field.data).first():
raise ValidationError('Username already in use.')
我有一个基本的 registration/login 构建,可以按预期工作。我遇到的问题是我不知道如何检查用户名是否已被使用,然后闪现一条消息说明如此。
我的路线
@app.route("/signup", methods=['GET', 'POST'])
def signup():
form = RegisterForm()
if form.validate_on_submit():
hashed_password = generate_password_hash(form.password.data, method='sha256')
new_user = User(username=form.userName.data, email=form.email.data, password=hashed_password)
db.session.add(new_user)
db.session.commit()
flash("Registration successful...please log in!")
return redirect(url_for('login'))
return render_template("signup.html", form=form)
我的用户模型
class User(UserMixin, db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(20), unique=True)
email = db.Column(db.String(50), unique=True)
password = db.Column(db.String(80))
我的HTML(错误div)
{% for field, errors in form.errors.items() %}
<div class="alert alert-error">
{{ form[field].label }}: {{ ', '.join(errors) }}
</div>
{% endfor %}
一种可能性是编写一个 custom validator 查询数据库以查找具有该名称的现有用户,如果查询成功则抛出错误。
from flask_wtf import FlaskForm
from wtforms.validators import DataRequired
from wtforms.validators import ValidationError
class RegisterForm(FlaskForm):
# ...
username = StringField(
'Username',
validators=[
DataRequired(),
# ...
])
# ...
def validate_username(self, field):
if User.query.filter_by(username=field.data).first():
raise ValidationError('Username already in use.')