Python: сопоставление имен пользователей с паролем; запрашивается пароль, если неверный; - PullRequest
1 голос
/ 06 августа 2011

Я пытаюсь создать логин.

Я не уверен, как создать / импортировать библиотеку имен пользователей и паролей; Я сейчас пытаюсь найти ответ, но спросил в любом случае.

сопоставление имен пользователей с паролями // (частично решено; необходимо добавить несколько имен пользователей с совпадающими паролями)

Как создать цикл, если пароль неверный? Если введен неправильный пароль, пользователю необходимо снова ввести пароль для ввода пароля. // (решено; используйте [печать] вместо [возврат])

Как ограничить цикл определенным количеством попыток ввода пароля.

Ниже я попробовал:

    def check_password(user, password):
""" Return True if the user/pass combo is valid and False otherwise. """

# Code to lookup users and passwords goes here.  Since the question
# was only about how to do a while loop, we have hardcoded usernames
# and passwords.
return user == "pi" and password == "123"

def login (): "" "Запросите имя пользователя и пароль, несколько раз, пока он не заработает. Верните True только в случае успеха. "" "

try:
    while True:
        username = raw_input('username:')
        password = raw_input('password:')
        if check_password(username, password):
            break
        else:
            print "Please try again"

    print "Access granted"
    return True
except:
    return False

Для тестирования

Логин ()

это исправлено отсутствие запроса цикла при неправильном пароле. * Из-за использования 'return' вместо 'print'; и "если" вместо "пока

    def login():
#create login that knows all available user names and match to password ; if password is incorect returns try again and propmts for password again# 
username = raw_input('username:')
if username !='pi':
    #here is where I would need to import library of users and only accept those usernames; needs to be like 'pi' or 'bob' or 'tim'etc.
    print'user not found'
    username = raw_input('username')
password = raw_input('password:')
#how to match password with user? store in library ? 
while password != '123':
    print 'please try again' # You have to change the 'return' to 'print' here
    password = raw_input('password')        
return 'access granted'
#basically need to create loop saying 'try again' and prompting for password again; maybe smarter to ask limited number of
#times before returning 'you have reached limit of attempts#
if password == '123':
    #again matching of passwords and users is required somehow 
    return 'access granted'

Логин () Имя пользователя: wronguser Пользователь не найден usernamepi Пароль: wrongpass пожалуйста, попробуйте снова password123 «доступ предоставлен»

# первая попытка перед обновлением благодаря: Merigrim: def login ():

    # Create login that knows all available user names and match to password;
    # if password is incorect returns try again and propmts for password again# 
    username = raw_input('username:')
    if username !='pi':
        # Here is where I would need to import library of users and only 
        # accept those usernames; needs to be like 'pi' or 'bob' or 'tim'etc.
        return 'user not found'

    password = raw_input('password:')

    # How to match password with user? store in library? 
    if password != '123':
        return 'please try again'

    password = raw_input('password:')
    if password != '123':
        return 'please try again'

    # Basically need to create loop saying 'try again' and prompting 
    # for password again; maybe smarter to ask limited number of
    # times before returning 'you have reached limit of attempts

    elif password == '123':
        # Again matching of passwords and users is required somehow 
        return 'access granted'

Вот как это работает в настоящее время:

>>> login()
username:pi
password:123
'access granted'
>>> login()
username:pi
password:wrongpass
'please try again'

Мне нужно создать цикл, чтобы снова запросить пароль.

Ответы [ 2 ]

2 голосов
/ 06 августа 2011

То, что вы хотите, это оператор while .

Вместо вложения if-операторов, таких как:

if password != '123':
    return 'please try again'
    password = raw_input('password:')
    if password != '123':
        return 'please try again'
elif password == '123':
    return 'access granted'

Вы можете сделать это:

while password != '123':
    print 'please try again' # You have to change the 'return' to 'print' here
    password = raw_input('password:')
return 'access granted'

Это будет продолжать запрашивать пароль у пользователя, пока не будет введен правильный пароль. Если вы хотите поближе познакомиться с оператором while, я предлагаю вам ознакомиться с некоторыми учебниками, такими как this . Обратите внимание, что если вы вернете что-то, функция выйдет туда, поэтому пользователю никогда не будет предложено ввести пароль. В приведенном выше коде я изменил возврат на оператор печати. ​​

1 голос
/ 06 августа 2011

Вот еще одно решение с учетом имени пользователя и пароля, а также обработчик исключений на случай, если кто-то попытается прервать ввод.

Кроме того, к вашему сведению, лучше всего объединить пользователя и пароль, чтобы не дать взломщикам понять, что является и не является действительным именем пользователя.

def check_password(user, password):
    """ Return True if the user/pass combo is valid and False otherwise. """

    # Code to lookup users and passwords goes here.  Since the question
    # was only about how to do a while loop, we have hardcoded usernames
    # and passwords.
    return user == "pi" and password == "123"

def login():
    """ Prompt for username and password, repeatedly until it works.
    Return True only if successful.
    """

    try:
        while True:
            username = raw_input('username:')
            password = raw_input('password:')
            if check_password(username, password):
                break
            else:
                print "Please try again"

        print "Access granted"
        return True
    except:
        return False

# For testing
login()
...