Home > OS >  Login example - accessing class instance with user input
Login example - accessing class instance with user input

Time:09-30

Was hoping can get some help with an example of building a list of users and then making a login attempt using input. Issue is when entering valid user name which is treated as a string and not class User so error emerges when trying to check the password.

code as follows:

class User():
    def __init__(self, first_name, last_name, username, password, status=True):
        self.first_name = first_name
        self.last_name = last_name
        self.password = password
        self.name = first_name.title()   " "   last_name.title()              

users = [ ]

def add_user():
    new_username = input("Choose a Username: ")    
    while new_username in users:
        new_username = input("Username already in use; choose a different username: ")
    password = ""
    while len(password) != 4:
        password = input("Choose a 4 character password: ")
    first_name = input("First name? ")
    last_name = input("Last name? ")

    username = User(first_name, last_name, new_username, password)
    print("Welcome "   username.name)
    users.append(new_username)
    print(users)

    more = input("Add another user? (Y/N) ").lower()
    if more != ("n" or "no"):
        add_user()

def login():
    username_entry = ""
    while username_entry not in users:
        username_entry = input("Username? ")
    if User(username_entry).status == False:
        print("Account locked")
    else:
        password_count = 0
        password_entry = ""
        if password_count < 4:
            while password_entry != username_entry.password:
                password_entry = input("Password? ")
                password_entry  = 1
            print("Login details accepted. Welcome "   username_entry.name)
        else:
            print("Login attempts exceeded.  Contact customer support for assistance.")
            username_entry.status=False

    more = input("Login user? (Y/N) ").lower()
    if more != ("n" or "no"):
        login()

add_user()
login() 

CodePudding user response:

You should use a dictionary to store your users and index it by username. I implemented some fixes to your code below, but here is a short list of changes/fixes:

  • added a status attribute to User
  • changed users to a dictionary indexed by usernames
  • changed references to User objects to be more consistent
  • fixed a bug in your password checker that would never allow you to be locked out, no matter how many attempts you put in
class User():
    def __init__(self, first_name, last_name, username, password, status=True):
        self.first_name = first_name
        self.last_name = last_name
        self.password = password
        self.name = first_name.title()   " "   last_name.title()
        self.status = status

users = {}

def add_user():
    while True:
        new_username = input("Choose a Username: ")    
        while new_username in users:
            new_username = input("Username already in use; choose a different username: ")
        password = ""
        while len(password) != 4:
            password = input("Choose a 4 character password: ")
        first_name = input("First name? ")
        last_name = input("Last name? ")
        user = User(first_name, last_name, new_username, password)
        print("Welcome "   user.name)
        users[new_username] = user
        print(users)
        more = input("Add another user? (Y/N) ").lower()
        if more in ("n", "no"):
            break

def login():
    while True:
        username_entry = ""
        while username_entry not in users:
            username_entry = input("Username? ")
        user = users[username_entry]
        if user.status == False:
            print("Account locked")
        else:
            password_count = 0
            password_entry = ""
            while True:
                if password_count >= 3:
                    print("Login attempts exceeded.  Contact customer support for assistance.")
                    user.status=False
                    break
                password_entry = input("Password? ")
                password_count  = 1
                if password_entry == user.password:
                    print("Login details accepted. Welcome "   user.name)
                    break
        more = input("Login user? (Y/N) ").lower()
        if more in ("n", "no"):
            break

add_user()
login() 

CodePudding user response:

In your case, you should think your problem as an object oriented. Your User class should have username and status attribute. When you want to keep username list, you should append user object into list, not only username. In addition when you reach username or other attributes(status etc.) of any users, you should these operation over user object. These methodology make easier for you when your project grown up.

I added some changes into your code and make comments on changing lines.

class User():
    def __init__(self, first_name, last_name, username, password, status=True):
        self.first_name = first_name
        self.last_name = last_name
        self.password = password
        self.name = first_name.title()   " "   last_name.title()

        # Assign attributes to object...
        self.status = status
        self.username = username

users = [ ]

def add_user():
    new_username = input("Choose a Username: ")    
    while new_username in users:
        new_username = input("Username already in use; choose a different username: ")
    password = ""
    while len(password) != 4:
        password = input("Choose a 4 character password: ")
    first_name = input("First name? ")
    last_name = input("Last name? ")

    user = User(first_name, last_name, new_username, password)
    print("Welcome "   user.name)

    # You should append user object not new_username!
    users.append(user)
    print(user.username)

    more = input("Add another user? (Y/N) ").lower()
    if more != ("n" or "no"):
        add_user()

def login():
    username_entry = ""
    while username_entry not in (user.username for user in users):
        username_entry = input("Username? ")

    # Finding user adding existing before...
    for user in users:

        # Control username...
        if(user.username == username_entry):

            # Then control username locked or not?...
            if user.status == False:
                print("Account locked")
            else:
                password_count = 0
                password_entry = ""
                if password_count < 4:
                    while password_entry != user.password:
                        password_entry = input("Password? ")

                        # Increase count not entry!
                        password_count  = 1
                    print("Login details accepted. Welcome "   user.name)
                else:
                    print("Login attempts exceeded.  Contact customer support for assistance.")
                    user.status=False

            break

    more = input("Login user? (Y/N) ").lower()
    if more != ("n" or "no"):
        login()

add_user()
login() 
  • Related