Python用户名和密码

2024-09-21 02:34:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试创建一个程序,您可以在其中创建、登录和删除帐户。我列出了两个列表,一个有用户名,一个有密码。脚本要求输入,如果您说登录,它会显示:

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”视为整数。由于字符串的原因,引用也是如此。它不把它们当作变量。有办法解决这个问题吗?

我希望如果我的问题得到回答,两个人不会同时注册,索引会出现故障。


Tags: in列表inputyourrawifisusername
3条回答

你想要的是地图,或者字典。它的密钥是用户名,其内容是该用户名的密码。

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"

当然,在一个真正的系统中,你会存储经过加密的密码。

而是创建一个用户列表,并创建用户对象,这些对象将用户名和密码作为属性。

拥有两个列表迟早会失去同步。

您应该使用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

相关问题 更多 >

    热门问题