作業一:寫上登陸介面
## 1.輸入使用者名稱與密碼
2.認證成功後顯示歡迎訊息
3.失敗三次後鎖定
想法:
(1)使用者輸入使用者名稱;
(2)去鎖定檔案中驗證使用者名稱是否鎖定;
(3)去目前使用者驗證使用者是否存在;
(4)使用者輸入密碼,三次輸錯後鎖定
注意檔案的讀取、修改、寫入操作,這些操作是要藉助列表來完成的,不然就會導致一些不必要的錯誤,最後定義一個函數來完成這些操作,使用的時候呼叫這些函數就可以了。
程式碼如下:
import os,sys,getpass,collections retry_limit = 3 #密码错误三次被锁定 retry_count = 0 #起始次数是0次 def locked_user(users,filename): #用于存放锁定用户的文件,当用户锁定的时候,要从原文件删除,添加到新的文件中 with open(filename,"w+") as locked_f:for key,value in users.items(): line = [] line.append(key) line.append(value) file_line = " ".join(line) + "\n"locked_f.write(file_line) active = Trueif __name__ == "__main__":while True: username = input("请输入用户名(输入quit退出):") with open("account_lock.txt","r") as f: user_lists = f.readlines()for user_list in user_lists:if user_list.strip() == username: print("您好,你的用户已经被锁定,请联系管理员!")continue #如果用户锁定,结束当前循环,执行下一次用户输入else: passif username == "quit": sys.exit(0) with open("account.txt") as active_f: users_dict = collections.OrderedDict()for line in active_f: user,pwd = line.strip().split() users_dict[user] = pwdif username in users_dict.keys():while retry_count < retry_limit: passwd = getpass.getpass("请输入你的密码:") # 隐藏式输入密码 # 判断用户是否在用户列表中if users_dict[username] == passwd: print("欢迎回来,认证成功!")breakelse:if retry_count != 2: #提示用户注意,还有几次机会将被锁定 print("您输入的密码不对,您还有%d次机会,否则系统将被锁定!" % (2 - retry_count)) retry_count += 1else: print("您输入的次数过多,%s已被锁定,请联系管理员" %username) #用户锁定之后,要把锁定的用户从当前文件删除,移到锁定文件中 users_dict.pop(username) locked_user(users_dict,"account.txt") with open("account_lock.txt","a+") as a_f: a_f.write(username + "\n")else: print("对不起,您输入的用户不存在,请重新输入!!!")########## 上面程式碼實作了登入介面的功能,但是有一些小小的瑕疵,就是鎖定文件的寫入不是很好,會出現兩個空行的情形,這種方式就只能寫讀取之前的文件,放到一個列表中,然後把鎖定用戶加到這個列表,重新再次讀入文件,下面將對程式碼進行修正。 #########
with open(filename,) key,value line = file_line = .join(line) + active = __name__ == retry_limit = retry_count = username = input( with open(,) user_lists = user_list user_list.strip() == print( username == sys.exit( with open() users_dict = line user,pwd = users_dict[user] = username retry_count < passwd = input( users_dict[username] == print( retry_count != print( % ( - retry_count += print( % locked_user(users_dict, with open(,) user_lines = user_messages = user_line with open(,) user_message user_message = user_message + print() 运行如下: 请输入用户名(输入quit退出):zeng 请输入你的密码:222 您输入的密码不对,您还有2次机会,否则系统将被锁定! 请输入你的密码:222 您输入的密码不对,您还有1次机会,否则系统将被锁定! 请输入你的密码:222 您输入的次数过多,zeng已被锁定,请联系管理员 ['chang', 'geng', 'xue', 'zeng'] 请输入用户名(输入quit退出):zhu 请输入你的密码:333 您输入的密码不对,您还有2次机会,否则系统将被锁定! 请输入你的密码:333 您输入的密码不对,您还有1次机会,否则系统将被锁定! 请输入你的密码:333 您输入的次数过多,zhu已被锁定,请联系管理员 ['chang', 'geng', 'xue', 'zeng', 'zhu'] 请输入用户名(输入quit退出):quit######### 程式碼中,我們在寫入檔案的時候經過了一步轉換,如下圖:########### # 上面是文件轉換的過程,這種方法是常用的文件處理的形式,但是要注意,使用"w"讀取文件的時候,一定要特別注意,這種方式會情況原有的文件內容,一定要謹慎使用,別一不小心把公司文件庫狀況了,到時候老闆pass你。 ######### ###
以上是登入介面的詳細內容。更多資訊請關注PHP中文網其他相關文章!