Как сделать условие «если цикл выполняется в последний раз» в Python - PullRequest
0 голосов
/ 19 июня 2019

Итак, я делаю систему входа через обработку файлов в python. Код работает нормально, когда я ввожу правильное имя пользователя / пароль, но не работает, когда я использую оператор «else» для условия, которое должно выполняться, когда пользователь вводит неправильный пароль.

for line in open('accounts.txt','r+').readlines():
    loginfo = line.split()
    if a==loginfo[0] and b==loginfo[1]:
        return render(request, 'login.html')
    else:
        return render(request, 'index.html')
  • Здесь выполняется цикл, и каждая строка проверяется, чтобы увидеть, есть ли имя пользователя, пароль, введенный пользователем, в файле или нет.
  • Я использую функцию getlines () для получения имен пользователей и паролей пользователя через строки, что означает, что каждая строка должна состоять из имени пользователя и пароля, разделенных пробелом.
  • Я использую line.split для разделения имен пользователей и паролей в файле.
  • Если я удалю «else», то введу правильный пароль, тогда код работает нормально, но не работает, когда я ввожу неверный пароль.
  • Если я помещаю условие 'else' в цикл, то это портит алгоритм, и веб-страница отображается при первом выполнении цикла.
  • Я хочу, чтобы условие «else» выполнялось только, а веб-страница index.html отображалась только после полной проверки файла (это означает, что цикл for выполняется в последний раз). и имя пользователя / пароль, введенные пользователем, не найдены в файле.

Ответы [ 3 ]

1 голос
/ 19 июня 2019

Здесь не нужны ни флаг, ни отдельная функция:

# use a with block to ensure the file will be properly closed
with open("accounts.txt") as file:
    # files are their own iterators, no need to read the
    # whole file in memory
    for line in file:
        # get rid of newlines / trailing whitespaces etc
        loginfo = line.strip().split()
        if a==loginfo[0] and b==loginfo[1]:
            return render(request, 'login.html')

    # if a match has been found, we'll never get here,
    # so if we get here no match has been found...
    return render(request, 'index.html')

Теперь я должен сказать, что хранить данные для входа в текстовый файл - наихудшая идея, особенно когда Django - полная, безопасная, работающая и очень простая в использовании система аутентификации / пользователя.

0 голосов
/ 19 июня 2019

В вашем текстовом файле много строк, и каждая соответствует определенной учетной записи. Ошибка, которую вы делаете, заключается в том, что вы возвращаете False внутри цикла, что неправильно, потому что вы должны пройти по всем строкам. После этого вы можете просто вернуть False, потому что ни одна учетная запись не соответствует логину и паролю

def check_login():
    for line in open('accounts.txt','r+').readlines():
        loginfo = line.split()
        if a==loginfo[0] and b==loginfo[1]:
            return True
    return False

def login_view(request):
    if check_login():
        return render(request, 'index.html')
    else:
        return render(request, 'login.html')
0 голосов
/ 19 июня 2019
for line in file:  
    loginfo = line.strip().split()
    if a==loginfo[0] and b==loginfo[1]:
        return render(request, 'login.html')
return render(request, 'index.html')

Примечание: - это должно применяться для distinct usernames

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...