简体   繁体   中英

Flask-Bcrypt Run time error

I was finishing up a simple little user login with Flask and Bcrypt . However, when trying to login with a user that is stored in my database, I keep encountering a runtime error . It looks like some sort of loop that's breaking. Being that I'm pretty new to programming, this has been incredibly challenging to figure out what I'm doing wrong. Hopefully someone here can help out! I'll past the relevant code below:

Here's the issue I'm getting. It just keeps looping this until it exceeds the maximum:

  File "C:\\Users\\desktop\\test\\app\\models.py", line 37, in password return self.password File "C:\\Users\\.virtualenvs\\flask\\lib\\site-packages\\sqlalchemy\\ext\\hybrid.py", 

line 742, in get return self.fget(instance) File "C:\\Users\\desktop\\test\\app\\models.py", line 37, in password

Models.py

class User(db.Model):
    __tablename__ = "users"
    id = db.Column(db.Integer, primary_key=True)
    nickname = db.Column(db.String(64), index=True, unique=True)
    email = db.Column(db.String(120), index=True, unique=True)
    password = db.Column(db.String(100))
    posts = db.relationship('Post', backref='author', lazy='dynamic',
                            primaryjoin="User.id==Post.user_id")
    about_me = db.Column(db.String(140))
    last_seen = db.Column(db.DateTime)
    followed = db.relationship('User',
                                secondary=followers,
                                primaryjoin=(followers.c.follower_id == id),
                                secondaryjoin=(followers.c.followed_id == id),
                                backref=db.backref('followers', lazy='dynamic'),
                                lazy='dynamic')


    @hybrid_property
    def password(self):
        return self.password



    @password.setter
    def set_password(self, plaintext):
        self.password = bcrypt.generate_password_hash(plaintext)

    def is_correct_password(self, plaintext):
        return bcrypt.check_password_hash(self.password, plaintext)

Forms.py

class LoginForm(Form):
    nickname = TextField('Nickname', validators=[DataRequired()])
    password = PasswordField('Password', validators=[DataRequired()])

Views.py Login

@app.route('/login', methods=['GET', 'POST'])
def login():
    form = LoginForm()
    if form.validate_on_submit():
        user = User.query.filter_by(nickname=form.nickname.data).first_or_404()
        if user.is_correct_password(form.password.data):
            login_user(user)
            flash("you've been logged in!, 'success'")
            return redirect(url_for('index'))
        else:
            flash('your email or password doesnt match!', 'error')
            return redirect(url_for('login'))
    return render_template('login.html',
                            title='Sign In',
                            form=form)

Views.py Registration

@app.route('/register', methods=('GET', 'POST'))
def register():
    form = forms.RegisterForm()
    if form.validate_on_submit():
        user = User(nickname=form.nickname.data, emai=form.email.data, password=form.password.data)
        db.session.add(user)
        db.session.commit()
        flash('User successfully registered')
        return redirect(url_for('login'))
    return render_template('register.html', form=form)

You should use different names for column and property

class User(db.Model):
    __tablename__ = "users"
    id = db.Column(db.Integer, primary_key=True)
    password_hash = db.Column(db.String(100))

    @hybrid_property
    def password(self):
        return self.password_hash

    @password.setter
    def set_password(self, plaintext):
        self.password_hash = bcrypt.generate_password_hash(plaintext)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM