Flask-login error , python

1.3k Views Asked by At

I'm new to python/flask and am trying to build app using flask-login. I can't get my head around the error I'm getting "object has no attribute 'get_id'" Appreciate your help.

class User(UserMixin):
    def __init__(self, email, id, active=True):
        self.email = email
        self.id = id
        #self.active = active

    def get_id(self):
        return self.id

    def is_active(self):
        # Here you should write whatever the code is
        # that checks the database if your user is active
        return True

    def is_anonymous(self):
        return False

    def is_authenticated(self):
        return True

login_manager = LoginManager()
login_manager.init_app(app)


 # load_user .. never makes it till here 
 @login_manager.user_loader
 def load_user(userid):
     try:
         print 'this gets executed:--', userid
         return User.get(User.id==userid)
     except User.DoesNotExist:
         return None


@app.route('/confirm/<token>', methods=['GET', 'POST'])
def confirm_email(token):
    try:
        email = confirm_token(token)
        print email
    except:
        flash('The confirmation link is invalid or has expired.', 'danger')

    userExists = db.userExists(email)

    if userExists:
        flash('Account already confirmed. Please login.', 'success')
        login_user(userExists, force=True, remember=True)
    else:
        flash('You have confirmed your account. Thanks!', 'success')
        confirm_login()
        login_user(userExists, force=True, remember=True)
    return redirect(url_for('Hello'))

code for db

def userExists(email):
    SQL = """SELECT * FROM all_users WHERE email = %s"""
    data = (email,)
    records = runQuery(SQL, data)
    if records and records[0]:
        return records[0][0]
    else:
        records

Error that I'm getting:

 File "/Documents/Dev/Ottawa-Final/ottawa-final/app/network_of_innovators.py", line 310, in confirm_email
    login_user(userExists, force=True, remember=True)
  File "/Documents/Dev/lib/python2.7/site-packages/flask_login.py", line 678, in login_user
    user_id = getattr(user, current_app.login_manager.id_attribute)()
AttributeError: 'str' object has no attribute 'get_id'
1

There are 1 best solutions below

0
On

In confirm_email, userExists is a string (I'm guessing the users email returned by your userExists() method). login_user() expects its first parameter to be an object but you're passing a string, hence your error.

The solution is to create a User object first and then pass that to login_user()

Ex. You should be doing something like:

userExists = db.userExists(email)
if userExists:
    flash('Account already confirmed. Please login.', 'success')
    user_id = db.getUserId(email) # Get the User's id somehow
    user = User(email, user_id)
    login_user(user, force=True, remember=True)