2015-02-12 2 views
1
def login():  
    user = raw_input("Username: ") 
    passw = raw_input("Password: ") 
    f = open("users.txt", "r") 
    for line in f.readlines(): 
     us, pw = line.strip().split("|") 
     if (user in us) and (passw in pw): 
      print "Login successful!" 
      return True 
    print "Wrong username/password" 
    return False 

def menu(): 
    #here's a menu that the user can access if he logged in. 

def main(): 
    login() 
    log = login() 
    if log == True: 
     menu() 

И users.txt является:Простая функция Войти в Python

john22|1234 
max2|2211 
jack6|1551 

Проблема, когда я запускаю программу и введите правильное имя пользователя и пароль, он печатает «Вход успешной!» но он не будет продолжать menu(). Вместо этого он снова показывает «Имя пользователя» и «Пароль:». Однако, когда я снова вводим правильное имя пользователя и пароль (такую ​​же или другую пару из users.txt), он входит в меню(), и все работает нормально. Так что я предполагаю, что вам по какой-то причине нужно ввести правильную информацию дважды, и я не хочу этого. Я искал везде, но я не могу понять, почему это происходит ...

+3

Взгляните еще раз на основной(). Похоже, вы дважды вызываете login(). Вы можете удалить первый вызов, потому что он ничего не возвращает. – nofinator

+1

И, пожалуйста, посмотрите https://docs.python.org/2/library/getpass.html :-). Потому что я предполагаю, что вы не хотите, чтобы пароль отображался на экране или в журналах. –

ответ

2

Вы звоните в свою login() функцию два раза. Только второй один использует возвращаемое значение, так что вы можете удалить первый вызов

def main(): 
    login()   # <--- Remove this one 
    log = login() 

Что-то вы, возможно, пожелает рассмотреть вопрос об использовании в getpass. Использование этого параметра вместо raw_input в вашем поле пароля предотвратит отображение пароля на экране.

import getpass 

... 

def login(): 
    ... 
    passw = getpass.getpass("Password: ") 

Остальная часть кода, то ведет себя так же, но на консоли, то результат выглядит следующим образом:

Username: max2 
Password: 
Login successful! 

Обратите внимание, что «Пароль:» строка пуста, несмотря на набрав в действующий пароль

1

Проблема в том, что вы звоните login() дважды whitin main. Чтобы исправить ошибку, просто удалите первый вызов, так как возврат даже не используется. Кроме того, я не уверен, является ли это предназначено, но:

if (user in us) and (passw in pw): 

будет соответствовать («пользователь», «проход»), даже если (мы, PW) является («имя пользователя», «пароль»). Вместо этого используйте оператор ==.

Одна малейшая вещь, вы должны рассмотреть вопрос об изменении:

us, pw = line.strip().split("|") 

To:

us, pw = line.strip().split("|", 1) 

который разделяет линию только один раз, в противном случае пароли не смогут содержать |

+0

Я думаю, что «мы» на самом деле является списком, содержащим все имена пользователей, поэтому я не должен использовать «in», так как я _searching_ для «пользователя» в «нас»? – blazePascal

+0

Нет, я уверен, что это строка, напечатайте ее, и вы увидите. –

1

Проблема заключалась в том, что было вызвано два экземпляра login(). Следующий код повторит Логин, пока это не правильно:

def login():  
    user = raw_input("Username: ") 
    passw = raw_input("Password: ") 
    f = open("users.txt", "r") 
    for line in f.readlines(): 
     us, pw = line.strip().split("|") 
     if (user in us) and (passw in pw): 
      print "Login successful!" 
      return True 
    print "Wrong username/password" 
    return False 

def menu(): 
    #here's a menu that the user can access if he logged in. 

def main(): 
    global True 
    while True: 
     True = True 
     log = login() 
     if log == True: 
      menu() 
      True = False 


main()