【问题标题】:Flask wtforms check if username already exists / flashing errorsFlask wtforms 检查用户名是否已经存在/闪烁错误
【发布时间】:2021-09-07 17:50:49
【问题描述】:

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

我的路线

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

【问题讨论】:

    标签: flask flask-sqlalchemy wtforms


    【解决方案1】:

    一种可能性是编写一个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.')
    

    【讨论】:

      猜你喜欢
      • 2021-11-30
      • 1970-01-01
      • 1970-01-01
      • 2023-01-28
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-05
      相关资源
      最近更新 更多