我正在尝试创建一个程序,您可以在其中创建,登录和删除帐户。我制作了两个列表,一个是用户名,另一个是密码。脚本要求输入,如果你说登录,它会说:
if loginchoice=='login':
choice = raw_input("What is your username? ")
choice2 = raw_input("What is your password? ")
if choice in accounts:
option1=1
else:
option1=0
if choice2 in password:
option2=1
else:
option2=0
if option1==1 and option2==1:
print "Welcome to Telemology,", choice
else:
print "The username or password you entered is incorrect. Please try again or register."
如您所见,它只检查输入是否已在列表中。它不会看输入是否具有相同的索引。我不能把“accounts.index(choice)”,因为它将'choice'视为一个整数。由于字符串,引用也是如此。它不会将它们视为变量。有没有办法解决这个问题?
我希望如果我的问题得到解答,两个人就不会同时注册并且会使指数出现故障。
答案 0 :(得分:2)
您想要的是地图或字典。它的关键是用户名,其内容是该用户名的密码。
users = {} # this is the mapping
users["joe"] = "123" # it currently contains username "joe" with password "123"
...
username = raw_input("What is your username? ")
password = raw_input("What is your password? ")
if username in users.keys():
expected_password = users[username]
if expected_password == password:
print "Welcome to Telemology,", username
else:
print "Didn't you forget your password,", username
else:
print "Unknown user"
当然,在实际系统中,您可以存储盐渍和加密的密码。
答案 1 :(得分:2)
您应该使用getpass模块来确保密码不会回显到屏幕和hashlib模块,以表示未存储原始密码。这是一个使用两个模块的类,应该在python2和python3上工作。如果要将其从文件中加载,则应将UserDB.users属性存储在文件中,可以使用json模块来执行此操作。
import getpass
import hashlib
import random
import sys
class UserDB():
def __init__(self, users=dict(), unprompt='Username:', pwprompt='Password:'):
self.users=dict(users)
self.unprompt=unprompt
self.pwprompt=pwprompt
def adduser(self):
if sys.version_info.major==3:
name=input(self.unprompt)
elif sys.version_info.major==2:
name=raw_input(self.unprompt)
passwd=getpass.getpass(self.pwprompt).encode('utf-8')
salt=bytes(random.randint(30, 95) for i in range(10))
passwd=hashlib.pbkdf2_hmac('sha512', passwd, salt, 10*10)
self.users[name]=[salt, passwd]
def deluser(self, name):
del self.users[name]
def __str__(self):
return str(self.users)
def __repr__(self):
return 'UserDB(users=%s, unprompt=%s, pwprompt=%s)' % (self.users,
ascii(self.unprompt),
ascii(self.pwprompt))
def login(self):
if sys.version_info.major==3:
name=input(self.unprompt)
elif sys.version_info.major==2:
name=raw_input(self.unprompt)
if name not in self.users:
return False
passwd=getpass.getpass(self.pwprompt).encode('utf-8')
salt=self.users[name][0]
passwd=hashlib.pbkdf2_hmac('sha512', passwd, salt, 10*10)
return self.users[name][1]==passwd
答案 2 :(得分:1)
因为它是login
,所以它应该是唯一的,你可以创建一个字典:
users = {'username':'password', ...}
然后像这样检查:
choice = raw_input("What is your username? ")
choice2 = raw_input("What is your password? ")
if (choice in users) and (choice2 == users[choice]):
# valid user
else:
# login or password incorrect.
答案 3 :(得分:1)
改为创建一个用户列表,并创建用户对象,其中包含用户名和密码作为属性。
有两个列表迟早会被取消同步。
答案 4 :(得分:1)
我看到的一些问题:
我还没有找到不回显密码的便携方法。 #2用字典解决。对于#3,您可能希望使用hashlib模块:
from hashlib import sha224
PASSWORD_HASHES = {}
def set_password(account, raw_password):
PASSWORD_HASHES[account] = sha224(raw_password).digest()
def authenticate(account, raw_password):
if account not in PASSWORD_HASHES:
return False
return PASSWORD_HASHES[account] == sha224(raw_password).digest()
将sha224
替换为您想要的任何哈希算法;我没有跟踪哪些密码仍然有用。
编辑:关于问题#1,如果您正在运行基于POSIX的系统(即不在Windows提示符下),您可以使用Python页面中的一些示例代码{{3模块获取密码而不将其回显到屏幕:
def getpass(prompt="Password: "):
import termios, sys
fd = sys.stdin.fileno()
old = termios.tcgetattr(fd)
new = termios.tcgetattr(fd)
new[3] = new[3] & ~termios.ECHO # lflags
try:
termios.tcsetattr(fd, termios.TCSADRAIN, new)
passwd = raw_input(prompt)
finally:
termios.tcsetattr(fd, termios.TCSADRAIN, old)
return passwd
这不会让*
为字符;它只是压制输入。要设置*
,你必须一次处理一个字符输入并编写更多代码。
答案 5 :(得分:1)
我有一个非常简单的代码,如果你的密码不匹配就可以两次尝试密码
users = {}
users["bob"] = "bob"
username = raw_input("What is your username? ")
password = raw_input("What is your password? ")
if username in users.keys():
expected_password = users[username]
if expected_password == password:
print "Welcome to Telemology,", username
else:
print "Didn't you forget your password,", username
password = raw_input("What is your password? ")
if username in users.keys():
expected_password = users["bob"]
if expected_password == password:
print "Welcome to Telemology,", username
#*here
else:
print "Didn't you forget your password,", username
else:
print "Unknown user"
#continue your code for wrong here else*
答案 6 :(得分:0)
或者你可以只使用SQLite3 db。这将允许您在运行时添加用户和密码。 SQLite3还提供散列本身。
答案 7 :(得分:0)
您始终可以使用帐户名称及其各自的密码创建字典。
dictionary={'username':'password','some other username':'some other password'}
if dictionary[choice] == choice2:
print 'Welcome to Telemology, %s' %choice
答案 8 :(得分:0)
您应该将密码输入更改为整数,如下所示:
password = raw_input("What is your password? ") --->this is your code
password = int(input("what is your password?")) --->modified code
然后一切都应该有用。