首页 > 解决方案 > Flask wtforms 检查用户名是否已经存在/闪烁错误

问题描述

我有一个按预期工作的基本注册/登录。我遇到的问题是,我无法弄清楚如何检查用户名是否已在使用,然后闪现一条消息。

我的路线

@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 %}

标签: flaskflask-sqlalchemywtforms

解决方案


一种可能性是编写一个自定义验证器,该验证器在数据库中查询已存在的具有该名称的用户,如果查询成功则抛出错误。

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

推荐阅读