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.')