此代码存在一些问题,想知道是否有人可以提供帮助,我恳求。
打开Unsolved/UserAdmin.py
。
getCreds
的函数,该函数不带任何会提示用户输入用户名和密码的参数。此函数应返回一个名为userInfo
的字典,该字典看起来像下面的字典:# Administrator accounts list
adminList = [
{
"username": "DaBigBoss",
"password": "DaBest"
},
{
"username": "root",
"password": "toor"
}
]
checkLogin
的函数:userInfo
和adminList
。该功能应检查凭据,以查看它们是否包含在登录管理列表中。如果在管理员列表中找到了凭据,则该函数应将变量loggedIn
设置为True
,否则将变量设置为False
。现在,我们知道了如何检查用户是否使用管理员凭据登录,让我们设置系统的一部分,如果用户未输入正确的管理员,它将继续提示用户输入用户名和密码。之前的凭据。
创建一个while
循环,该循环将继续调用getCreds
和checkLogin
,直到用户使用管理员凭据登录为止。
在checkLogin
循环中每次调用while
之后,将字符串"---------"
打印到终端。
用户使用管理员凭据登录后,在终端上打印字符串"YOU HAVE LOGGED IN!"
。
在使用正确和错误的管理员凭据编写和测试各个功能时,请经常运行代码,以确保您处在正确的路径上!
这是我需要帮助的问题
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)
这就是我得到的。循环未按预期工作,我无法得到肯定的结果
在此先感谢您能提供帮助的人
答案 0 :(得分:0)
adminList = [
{
"username": "DaBigBoss",
"password": "DaBest"
},
{
"username": "root",
"password": "toor"
}
]
def getCreds():
username = input("What is your username? ")
password = input("What is your password? ")
userInfo = [
{
"username" : (username),
"password" : (password)
}
]
return userInfo
user_info = getCreds()
def checkLogin(adminList, user_info):
user_info = getCreds()
if user_info in adminList:
loggedIn = True
print("you've logged in!")
else :
loggedIn = False
while loggedIn == False:
print("Login Failed. ")
print("---------")
retry = getCreds()
return retry
getCreds()
checkLogin(adminList, user_info)
输出
What is your username? root
What is your password? toor
What is your username? root
What is your password? toor
What is your username? root
What is your password? toor
Login Failed.
---------
What is your username?
这就是我要得到的
答案 1 :(得分:0)
当然,在正确的轨道上,您会遇到几个关键问题。
首先,如果仔细看,您的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: ")
答案 2 :(得分:0)
非常感谢您的帮助,这就是我想出的!似乎有些惊慌,发现只是循环永无休止,这没什么大不了的!再次非常感谢大家的帮助
adminList = [
{
"username": "DaBigBoss",
"password": "DaBest"
},
{
"username": "root",
"password": "toor"
}
]
# Build your login functions below
def getCreds():
username = input("What is your username? ")
password = input("What is your password? ")
return {"username": username, "password": password}
def checkLogin(adminList, user_info):
if user_info in adminList:
loggedIn = True
print("YOU HAVE LOGGED IN")
else:
loggedIn = False
print("------")
print("Login Failed")
print("------")
retry = getCreds()
return
while True:
user_info = getCreds()
is_admin = checkLogin(adminList, user_info)
print("-----")
if is_admin:
print("YOU HAVE LOGGED IN!")
break
else:
("login Failed please try again")