首页 > 解决方案 > pyhon上的密码功能,使用while循环

问题描述

我对此代码有一些问题,想知道是否有人可以提供帮助,我是乞求。打开Unsolved/UserAdmin.py

  1. 创建一个getCreds没有参数的函数,它会提示用户输入用户名和密码。此函数应返回一个名为的字典userInfo,类似于以下字典:
# Administrator accounts list
adminList = [
    {
        "username": "DaBigBoss",
        "password": "DaBest"
    },
    {
        "username": "root",
        "password": "toor"
    }
]
  1. 创建一个以checkLogin两个参数命名的函数:theuserInfoadminList. 该函数应检查凭据以查看它们是否包含在登录的管理员列表中。如果在管理员列表中找到凭据,该函数应将变量设置loggedIn为,否则将变量设置为。TrueFalse

现在我们知道如何检查用户是否使用管理员凭据登录,让我们设置系统的一部分,如果他们之前没有输入正确的管理员凭据,它将继续提示用户输入用户名和密码。

  1. 创建一个while循环,该循环将继续调用getCredscheckLogin直到用户使用管理员凭据登录。

  2. checkLogin在循环中每次调用后while,将字符串打印到终端"---------"

  3. 用户使用管理员凭据登录后,将字符串打印到终端"YOU HAVE LOGGED IN!"

  4. 在编写时经常运行代码,并使用正确和不正确的管理员凭据测试各个功能,以确保您走在正确的道路上!

这是我需要帮助的问题

def getCreds():

    username = input("What is your username? ")
    password = input("What is your password? ")

    #
    userInfo = [
        {
            "username" : str(username), 
            "password" : str(password)
        }
    ]

    return userInfo

user_info = getCreds()

def checkLogin(adminList):

    if user_info in adminList:
        loggedIn = True
        print("yay")

    else: 
        loggedIn = False

    while loggedIn == False:
        print("Login Failed. ")
        retry = getCreds()
        return retry

getCreds()

checkLogin(user_info, adminList) 

这就是我得到的。循环没有按预期工作,我无法得到积极的结果

提前感谢任何可以提供帮助的人

标签: python

解决方案


当然,在正确的轨道上,您在这里遇到了几个关键问题。

首先,如果您仔细查看,您的 getCreds 函数将返回一个包含单个条目的列表。方括号创建列表,大括号创建字典。

>>> type([])
<class 'list'>
>>> type({})
<class 'dict'>
>>> type([{}])
<class 'list'>

这意味着当您检查时if user_info in admin_list,您会看到一个list对象是否在您的admin_list中,我们知道该对象仅包含字典。我认为您要做的只是从以下位置返回字典getCreds

def getCreds():
    ...
    return {"username": username, "password": password}

接下来要注意的是该return语句退出了周围的函数,而不是循环或 if 语句。所以你的while循环只能运行一次。您会看到两个登录提示,因为一个在函数的开头,然后是该循环的第一次迭代,然后才存在。该break语句是退出当前循环的语句。

这听起来也像是您正在寻找的问题集,尽管 while 循环存在于任一函数之外:

def getCreds():
    # returns user info dictionary
    ...

def checkLogin(admin_list, user_info):
    # returns True or False
    ...


while True:
    user_info = getCreds()
    is_admin = checkLogin(admin_list, user_info)
    print("---------")
    if is_admin:
        print("YOU HAVE LOGGED IN!")
        break

关于安全性的最后一点说明,通常您不希望用户的密码在他们键入时在终端中可见。标准库模块中的getpass函数getpass提供了一种读取敏感数据(如密码)的简便方法,并将作为内置input函数的直接替代品:

# at the top of the whole file
from getpass import getpass

...

username = input("username: ")
password = getpass("password: ")

推荐阅读