2.1 問題
編寫login.py腳本,實現以下目標:
支持新用戶註冊,新用戶名和密碼註冊到字典中
支持老用戶登陸,用戶名和密碼正確提示登陸成功
主程序通過循環詢問進行何種操作,根據用戶的選擇,執行註冊或是登陸操作
2.2 方案
創建空字典存儲用戶名、密碼,用三個函數分別實現用戶註冊、用戶登錄以及判斷調用函數這三個方法,完成模擬用戶登錄:
1.調用show_menu()函數後,利用while循環交互端輸出提示,請用戶input0/1/2任意數值,如果輸入的值不是0/1/2,打印選擇無效請重新輸入並重新開始循環,如果輸入的值是2,停止整個循環,如果輸入的值是0/1/2通過字典鍵值對關聯關係,調用相對應函數
2.如果輸入的值是0,字典cmds中0鍵對應的值是register,register ()調用註冊函數,函數利用if方法判斷輸入用戶名是否存在,如果用戶名在字典中,輸出用戶名已存在,否則用戶輸入密碼,並將用戶名與密碼以鍵值對形式放入字典中
3.如上,如果輸入的值是1,調用登錄函數login(),利用if方法判斷輸入的用戶名的對應的密碼是否和字典中存儲用戶對應密碼相同,如果不同顯示登錄失敗,否則登錄成功,此函數中導入getpass模塊使用方法,作用是輸入密碼不可見。
2.3 步驟
實現此案例需要按照如下步驟進行。
步驟一:編寫腳本
[root@localhost day05]# vim login.py
#!/usr/bin/env python3
import getpass
userdb = {}
def register():
username = input('username: ')
if username in userdb:
print('\033[31;1m%s already exists.\033[0m' % username)
else:
password = input('password: ')
userdb[username] = password
def login():
username = input('username: ')
password = getpass.getpass('password: ')
# if username not in userdb or userdb['username'] != password:
if userdb.get(username) != password:
print('\033[31;1mLogin incorrect\033[0m')
else:
print('\033[32;1mLogin successful\033[0m')
def show_menu():
prompt = """(0) register
(1) login
(2) quit
Please input your choice(0/1/2): """
cmds = {'0': register, '1': login}
while True:
choice = input(prompt).strip()[0]
if choice not in '012':
print('Invalid choice. Try again.')
continue
if choice == '2':
break
cmds[choice]()
if __name__ == '__main__':
show_menu()
步驟二:測試腳本執行
[root@localhost day05]# python3 login.py
(0) register
(1) login
(2) quit
Please input your choice(0/1/2): 0
username: a
password: 123
(0) register
(1) login
(2) quit
Please input your choice(0/1/2): 1
username: a
password:
Login successful
(0) register
(1) login
(2) quit
Please input your choice(0/1/2): 1
username: b
password:
Login incorrect
(0) register
(1) login
(2) quit
Please input your choice(0/1/2): 2