Чего мне не хватает в этой функции входа в систему python?

#python

Вопрос:

Я пытаюсь написать функцию входа в систему с помощью python. Однако я, похоже, не могу написать код для проверки имени пользователя и пароля на соответствие тем, которые хранятся в файле. Конкретная ошибка-ошибка имени: имя «adusername» не определено. Как мне это исправить?

 def adminlogindetails():
    adusername = input("Admin Username: ")
    adpassword = input("Admin Password: ")
    adfile = open("adlogindetails.txt", "a")
    adfile.write(adusername)
    adfile.write(",")
    adfile.write(adpassword)
    adfile.write("n")
    adfile.close()

def adminverification():
    adun = input("Enter your username:")
    adpw = input("Enter your password:")
    adinfo = open("adlogindetails.txt", "r")
    for line in adinfo:
        adun, adpw = line.split(",")
        if adun == adusername and adpw == adpassword:
            print("Login successful!")
            adminoptions()
        else:
            print("Incorrect username/password")
            roleselection()

adminverification()
 

Комментарии:

1. Когда вы звоните adminverification , вы сначала не объявляете adusername или adpassword .

2. Также ты никогда не звонишь adminlogindetails

3. измените две первые строки на adminverification adusername = input("Enter your username:") adpassword = input("Enter your password:")

4. Вы, кажется, путаетесь в области переменных. Переменная, определенная внутри a def , не видна вне ее. Как только вы узнаете, как это работает, исправление должно быть очевидным и тривиальным; определите переменную, которую вы пытаетесь использовать.

5. Я вижу 2 ошибки: adun, adpw = line.split («,»), а также цикл for примет решение на первой итерации

Ответ №1:

Вы не заявили adusername и adpassword в adminverification() . Итак, это вызывает ошибку. Если вы хотите использовать переменные из adminlogindetails() , измените имя переменных, так как вы сохранили сведения в adlogindetails.txt .

Приведенный ниже код следует изменить, так как line переменная содержит уже сохраненные имя пользователя и пароль:

 adun, adpw = line.split(",")
 

Измените приведенный выше фрагмент кода на приведенный ниже:

 adusername, adpassword = line.split(",")
 

вы можете использовать это:

 def adminlogindetails():
    adusername = input("Admin Username: ")
    adpassword = input("Admin Password: ")
    adfile = open("adlogindetails.txt", "a")
    adfile.writelines(adusername   ','   adpassword )
    adfile.close()

def adminverification():
    adun = input("Enter your username:").strip()
    adpw = input("Enter your password:").strip()
    with open("adlogindetails.txt", "r") as f:
        lines = f.readlines()
        i = 0
        for line in lines:
            adusername, adpassword= line.split(",")
            adusername = str(adusername).strip()
            adpassword = str(adpassword).strip()
            if (adun == adusername) and (adpw == adpassword):
                print("Login successful!()")
                adminoptions()
                break
            else:
                i  = 1
                if i >= len(lines): #If no any match upto last line, this will be true
                    print("Incorrect username/password")
                    roleselection()
                    break
    
adminverification()
 

Комментарии:

1. спасибо за всю помощь, я исправил это соответствующим образом. Но теперь, когда я ввожу правильное имя и пароль, появляются результаты, соответствующие критериям (adminoptions()) и не соответствующие критериям (выбор ролей()). как мне это исправить?

2. Попробуйте распечатать adusername и adpassword перед печатью login successful . Также печатайте adusername и adpassword перед печатью Incorrect username/password . Можете ли вы подробнее рассказать, с какой проблемой вы столкнулись сейчас, обновив свой основной вопрос?

3. когда я ввожу правильное имя пользователя и пароль, результатом является «Вход успешен!», за которым следует результат adminoptions (), а прямо под ним «Неправильное имя пользователя/пароль» и результат выбора ролей (). в основном появляются оба результата для true и false

4. В вашем коде есть некоторые логические проблемы. Он проверит только первую строку файла и решит, соответствует ли она или нет.

5. в моем файле у меня есть 2 строки для 2 имен пользователей и паролей. перерыв решает проблему, когда я ввожу первое имя пользователя и пароль. но если я введу его во 2-й строке, он вернет ложный результат

Ответ №2:

Во-первых, вы не звоните adminlogindetails() .

Также adusername является локальной переменной, и вы должны либо сделать ее глобальной, используя global adusername в adminlogindetails функции, либо объявить ее вне функций в глобальной области.

Видишь это — https://www.w3schools.com/python/python_scope.asp

Ответ №3:

Эта строка-ваша проблема:

 adun, adpw = line.split(",")
 

«adun» и «adpw» — это ваши входные данные, и вы их перезаписываете. Замените это, и все будет в порядке:

 adusername, adpassword = line.replace("n", "").split(",")
 

Примечание: «n» необходимо удалить, чтобы ваше сравнение было в порядке.