要求:編寫登錄接口
1. 輸入用戶名和密碼
2. 認證成功后顯示歡迎信息
3. 輸錯三次后鎖定
?1)編寫思路
編寫思路參考下面GitHub鏈接中的流程圖
https://github.com/ChuixinZeng/PythonStudyCode/blob/master/PythonCode-OldBoy/Day1/作業/Day1_作業_登錄接口流程圖.png
?2)具體實現
1 # -*- coding:utf-8 -*- 2 3 # Author:Chuixin Zeng 4 5 # 字典和列表的區別:列表是有順序的,使用索引訪問;而字典中的條目是用鍵來訪問的 6 7 # 初始化空字典 8 _user_dict = {} 9 # 初始化空列表list,有了空的列表之后,程序就可以向這個列表中增加元素 10 _user_list = [] 11 # 初始化登錄不存在用戶名的初始值為0 12 _login_error_count = 0 13 14 # 使用while開始無限制的循環 15 while True: 16 # 交互式輸入登錄用戶名和密碼 17 _user_naming = input("Pls input your username:") 18 _user_password = input("Pls input your password:") 19 # 讀取用戶登錄數據文件UserPassword.txt 20 _users_data = open('UserPassword.txt') 21 # 循環遍歷打開的數據,對打開的數據進行格式化操作,然后把格式化以后的數據保存到創建好的_user_dict字典當中 22 for user_data in _users_data: 23 # 使用strip去除user_data數據行中的前后空格 24 _user_list = user_data.strip() 25 # 將去除前后空格之后的數據行_user_list使用逗號進行分割,并重新保存到_user_datas中 26 _user_datas = _user_list.split(',') 27 # 將_user_datas數據行中的第0個位置的數據(即用戶名),去除前后空格后,賦給新的變量_user_name 28 _user_name = _user_datas[0].strip() 29 # 將_user_datas數據行中的第1個位置的數據(即密碼),去除前后空格后,賦給新的變量_user_pass 30 _user_pass = _user_datas[1].strip() 31 # 將_user_datas數據行中的第2個位置的數據(即鎖定狀態,0代表未鎖定,1代表鎖定),去除前后空格后,賦給新的變量_user_locked 32 _user_locked = _user_datas[2].strip() 33 # 將_user_datas數據行中的第3個位置的數據(即密碼輸入錯誤次數),去除前后空格后,賦給新的變量_user_error_count 34 # 將_user_datas[3]的數據類型強制轉換為int 35 _user_error_count = int(_user_datas[3].strip()) 36 # 將前面定義好的變量信息,保存到字典中,為前面的值指定鍵名,即鍵:值對應的關系,鍵名可以隨便起,建議考慮易讀性 37 # 如果下面的鍵名出線下劃波浪線,并不代表有語法錯誤,而是編輯器認為拼寫的英文不是正確的英文單詞,不影響腳本執行 38 # 按照Python的編程規范,在逗號和冒號后面需要加一個空格 39 _user_dict[_user_name] = {'name': _user_name, 'password': _user_pass, 40 'locked': _user_locked, 'errorcount': _user_error_count} 41 42 # 關閉打開的UserPassword.txt文件 43 _users_data.close() 44 45 # 判斷用戶賬戶是否已經被鎖定,將前面交互界面輸入的用戶名和字典里保存的用戶名列進行匹配 46 # 將前面交互式輸入的用戶名和字典中的userlocked鍵進行匹配,如果用戶名對應的鍵為1,就是被鎖定了,退出登錄 47 if _user_naming in _user_dict.keys(): 48 if _user_dict[_user_naming]['locked'] == '1': 49 print("The account was locked,pls contact administrator!") 50 break 51 # 將前面輸入的用戶名、密碼和字典中的用戶名、密碼進行匹配,如果成功,則輸出登錄系統,然后退出 52 if _user_naming == _user_dict[_user_naming]['name'] and _user_password == _user_dict[_user_naming]['password']: 53 print("Welcome to System!") 54 break 55 else: 56 # 如果用戶名在字典里,但是密碼不對,將前面輸入的用戶名所對應字典中的錯誤次數進行自增 57 _user_dict[_user_naming]['errorcount'] += 1 58 # 如果用戶名輸入正確的情況下,密碼輸入錯誤的次數小于3次,給用戶重新嘗試的機會 59 if _user_dict[_user_naming]['errorcount'] < 3: 60 print("The password was wrong,pls try again,your have three chance!") 61 # 追加寫入新的數據到UserPassword.txt,其中的errorcount會隨著失敗嘗試次數的增加而增加,三次就是2,即0,1,2 62 _write_data = open('UserPassword.txt', 'w+') 63 # 將字典里面的值取到_user_value中,進行循環遍歷 64 for _user_value in _user_dict.values(): 65 # 往腳本開頭定義好的空列表里面逐行寫入數據 66 _user_list = [_user_value['name'], _user_value['password'], str(_user_value['locked']), 67 str(_user_value['errorcount'])] 68 # 將寫入到_user_list的數據再次進行格式化后賦給_users_list 69 _users_list = ','.join(_user_list) 70 # 將_users_list中的數據寫入到UserPassword.txt中,并在每一行數據的結尾進行換行 71 _write_data.write(_users_list + '\n') 72 # 關閉UserPassword.txt文檔 73 _write_data.close() 74 75 else: 76 # 如果密碼不正確的次數已經超過3次,就輸出賬戶被鎖定 77 print("You try three times,Account locked") 78 # 輸出賬戶鎖定的同時,將字典中locked鍵的值設置為1,這個地方改成1,前面判斷Locked狀態的IF才生效 79 _user_dict[_user_naming]['locked'] = 1 80 # 賬戶設置為鎖定之后,將用戶對應的錯誤密碼次數清零,我理解的是鎖定屬性為1了,錯誤次數可以清零 81 _user_dict[_user_naming]['errorcount'] = 0 82 _write_data = open('UserPassword.txt', 'w+') 83 for _user_value in _user_dict.values(): 84 _user_list = [_user_value['name'], _user_value['password'], str(_user_value['locked']), 85 str(_user_value['errorcount'])] 86 _users_list = ','.join(_user_list) 87 _write_data.write(_users_list + '\n') 88 _write_data.close() 89 break 90 91 92 else: 93 # 如果用戶名不存在,則輸出信息 94 print("Pls ensure input currect account or password,you can try three times!") 95 # 程序開頭設置了初始化不存在用戶名的值為0,這里進行自增 96 _login_error_count += 1 97 # 如果不存在的用戶嘗試次數超過3次,則中斷程序 98 if _login_error_count > 2: 99 break
?3)Github筆記
第一天的筆記的地址是:
https://github.com/ChuixinZeng/PythonStudyCode/tree/master/PythonCode-OldBoy/Day1/隨堂練習
第一天作業的地址是:
https://github.com/ChuixinZeng/PythonStudyCode/tree/master/PythonCode-OldBoy/Day1/作業
?4)Readme.md文檔
https://github.com/ChuixinZeng/PythonStudyCode/blob/master/PythonCode-OldBoy/Day1/作業/Readme_登陸接口.md