我正在尝试使用字典构建一个简单的登录和密码应用程序。它工作正常,除了检查登录是否与密码匹配的部分(在底部显示“登录成功!”)。
如果我要创建登录'a'和密码'b',然后创建登录'b'和密码'a',如果我尝试使用登录'a'和密码登录,它会登录我一个'。它只是检查字典中某些字符是否存在,但如果它们是一对则不存在。
有任何建议如何解决这个问题?
users = {}
status = ""
while status != "q":
status = raw_input("Are you a registered user? y/n? Press q to quit: ")
if status == "n": #create new login
createLogin = raw_input("Create login name: ")
if createLogin in users: # check if login name exist in the dictionary
print "Login name already exist!\n"
else:
createPassw = raw_input("Create password: ")
users[createLogin] = createPassw # add login and password
print("\nUser created!\n")
elif status == "y": #login the user
login = raw_input("Enter login name: ")
if login in users:
passw = raw_input("Enter password: ")
print
if login in users and passw in users: # login matches password
print "Login successful!\n"
else:
print
print("User doesn't exist!\n")
修改
现在这是有效的,我试图将应用程序划分为三个函数,以便于阅读。它有效,除了我得到无限循环。
有什么建议吗?
users = {}
status = ""
def displayMenu():
status = raw_input("Are you a registered user? y/n? Press q to quit: ")
if status == "y":
oldUser()
elif status == "n":
newUser()
def newUser():
createLogin = raw_input("Create login name: ")
if createLogin in users: # check if login name exists
print "\nLogin name already exist!\n"
else:
createPassw = raw_input("Create password: ")
users[createLogin] = createPassw # add login and password
print("\nUser created!\n")
def oldUser():
login = raw_input("Enter login name: ")
passw = raw_input("Enter password: ")
# check if user exists and login matches password
if login in users and users[login] == passw:
print "\nLogin successful!\n"
else:
print "\nUser doesn't exist or wrong password!\n"
while status != "q":
displayMenu()
答案 0 :(得分:3)
目前您正在检查指定的密码passw
是否与users
中的任何键匹配(不正确)。您需要查看输入的密码是否与特定用户的密码相匹配。由于您已经检查过字典键中是否存在用户名,因此您无需再次检查,因此请尝试以下操作:
if passw == users[login]:
print "Login successful!\n"
编辑:
对于您更新的代码,我将假设“无限循环”,您的意思是您不能使用q
退出程序。这是因为当您在displayMenu
内时,您将用户输入保存在名为status
的本地变量中。此本地变量不引用您正在检查的同一status
,
while status != "q":
换句话说,您在两个不同的范围中使用变量status
(更改内部范围不会更改外部)。
有很多方法可以解决这个问题,其中一种方法就是改变,
while status != "q":
status = displayMenu()
在displayMenu
末尾添加一个return语句,如此,
return status
通过执行此操作,您将status
的新值从displayMenu
的本地范围保存到脚本的全局范围,以便while
循环可以正常工作。
另一种方法是将此行添加到displayMenu
的开头,
global status
这告诉Python status
中的displayMenu
引用了全局范围的status
变量,而不是新的本地范围变量。
答案 1 :(得分:1)
更改
if login in users and passw in users: # login matches password
到
if users[login] == passw: # login matches password
此外,你不应该告诉黑客“用户不存在!”。更好的解决方案是告诉一般的原因:“用户不存在或密码错误!”
答案 2 :(得分:0)
如果您将此密码放在网上,请加密您在数据库中的密码。 干得好。
import md5
import sys
# i already made an md5 hash of the password: PASSWORD
password = "319f4d26e3c536b5dd871bb2c52e3178"
def checkPassword():
for key in range(3):
#get the key
p = raw_input("Enter the password >>")
#make an md5 object
mdpass = md5.new(p)
#hexdigest returns a string of the encrypted password
if mdpass.hexdigest() == password:
#password correct
return True
else:
print 'wrong password, try again'
print 'you have failed'
return False
def main():
if checkPassword():
print "Your in"
#continue to do stuff
else:
sys.exit()
if __name__ == '__main__':
main()
答案 3 :(得分:0)
usrname = raw_input('username : ')
if usrname == 'username' :
print 'Now type password '
else :
print 'please try another user name .this user name is incorrect'
pasword = raw_input ('password : ')
if pasword == 'password' :
print ' accesses granted '
print ' accesses granted '
print ' accesses granted '
print ' accesses granted '
print 'this service is temporarily unavailable'
else :
print 'INTRUDER ALERT !!!!' , 'SYSTEM LOCKED'
print 'INTRUDER ALERT !!!!' , 'SYSTEM LOCKED'
print 'INTRUDER ALERT !!!!' , 'SYSTEM LOCKED'
exit()
答案 4 :(得分:0)
这是一个非常简单的基于前一个用户,具有改进的语法和错误修复:
print("Steam Security Software ©")
print("-------------------------")
print("<<<<<<<<<Welcome>>>>>>>>>")
username = input("Username:")
if username == "username" :
print ("Now type password")
else :
print ("please try another user name. This user name is incorrect")
password = input ("Password:")
if password == "password" :
print ("ACCESS GRANTED")
print ("<<Welcome Admin>>")
#continue for thins like opening webpages or hidden files for access
else :
print ("INTRUDER ALERT !!!!" , "SYSTEM LOCKED")
exit()