python - pyhon上的密码功能,使用while循环
问题描述
我对此代码有一些问题,想知道是否有人可以提供帮助,我是乞求。打开Unsolved/UserAdmin.py
。
- 创建一个
getCreds
没有参数的函数,它会提示用户输入用户名和密码。此函数应返回一个名为的字典userInfo
,类似于以下字典:
# Administrator accounts list
adminList = [
{
"username": "DaBigBoss",
"password": "DaBest"
},
{
"username": "root",
"password": "toor"
}
]
- 创建一个以
checkLogin
两个参数命名的函数:theuserInfo
和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)
这就是我得到的。循环没有按预期工作,我无法得到积极的结果
提前感谢任何可以提供帮助的人
解决方案
当然,在正确的轨道上,您在这里遇到了几个关键问题。
首先,如果您仔细查看,您的 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: ")
推荐阅读
- java - 如何在spring boot的application.yml中定义空列表
- windows - 为什么 PS1 脚本中的 PS1 调用在 Powershell 中执行时运行,但在作为 Windows 计划任务运行时不执行?
- mysql - 对将破折号“-”视为空格的字符串字段的 SELECT 查询
- ssis - 如何在SSIS中将带逗号的字符串转换为十进制?
- reactjs - TypeError:无法读取未定义的属性“isAuthenticated”
- loops - Stata:使用 foreach 生成变量
- sql - 具有最新记录的 Oracle 查询 GROUP BY
- snowflake-cloud-data-platform - 如何在雪花中删除所有任务
- sql - 如何编写 SQL 查询以确定点是否在框中?
- c# - 无法将 ServerEventMessage 从 ServiceStack 解析到 C#