>[info] 本練習,是根據前面學習的知識而設置,請獨立完成功能。如果你還無法獨立完成以下練習,則證明還沒有掌握前面的章節,好好回顧一下吧。
## 題目要求:
>[success]
>1. 讓用戶輸入賬號與密碼
>2. 如果賬號密碼匹配(用戶名:Milton,密碼:123456),則提示歡迎信息,退出程序
>3. 如果賬號不存在,則提示賬號不存在,重新回到步驟1
>4. 如果密碼不匹配,則提示密碼有誤,重新回到步驟1
>5. 密碼連續錯誤3次以上,提示賬號已被鎖定,重新回到步驟1
>
>附加要求:
>1. 用戶信息保存在json文件中
>2. 密碼md5加密保存
>3. 賬號鎖定時間為2分鐘
>4. 充分使用函數編程
>
## 規則
* 請獨立完成實戰要求,完成后再參考下面的示例代碼
* 如果覺得自己的代碼<span style="color:red">*更加優雅,更加高效*</span>,歡迎留言**,與大家一起**分享**哦~
:-: <span style="color:green;font-size:30;">一起來挑戰吧~</span>
<br>
## 參考代碼
用戶數據文件 user.txt 內容如下:(pwd的值為md5(“123456”))
```cmd
{
"Milton": {
"pwd": "e10adc3949ba59abbe56e057f20f883e",
"errors": 1,
"lock_time": 0.0
},
"Cherish": {
"pwd": "e10adc3949ba59abbe56e057f20f883e",
"errors": 0,
"lock_time": 0.0
}
}
```
python代碼如下:
```python
#!/usr/bin/python
# coding=utf-8
import json
import time
import hashlib
def load_user(path="user.txt"):
"""
載入用戶數據
:param path:
:return:
"""
with open(path, "r") as read_file:
user_items = json.load(read_file)
return user_items
def auth(name,pwd,lock_time=120):
"""
用戶鑒權
:param name:
:param pwd:
:param lock_time:
:return:
"""
user_items=load_user()
if name in user_items.keys():
# 用戶名匹配
user_obj=user_items.get(name)
errors = int(user_obj.get("errors"))
last_time = float(user_obj.get("lock_time"))
r_pwd=user_obj.get("pwd")
# 對登錄時輸入的密碼進行md5加密
md5 = hashlib.md5()
md5.update(pwd.encode())
pwd = md5.hexdigest()
if pwd == r_pwd:
# 密碼匹配
if time.time() - last_time > lock_time or errors < 3:
print("Dear [%s],welcome~" % name)
modify_user(name, "clear_error")
return True
else:
print("您賬號已被鎖定,請等候 [%f]s 后重試!" % (lock_time - (time.time() - last_time)))
else:
# 密碼不匹配
if errors+1 < 3:
# 錯誤次數小于3:提示登錄失敗,添加登錄錯誤次數
print("您的密碼不正確,未被鎖定,請重新輸入!")
modify_user(name, "add_error")
elif errors+1==3:
# 在本次失敗之前,已存在2次失敗
print("您已經連續3次登錄失敗,賬號已被鎖定,請重新輸入!")
modify_user(name, "add_error")
elif time.time() - last_time > lock_time:
# 已鎖定狀態,并且限制時間已過期:重新計算錯誤次數
print("您的密碼不正確,賬號已被鎖定,請重新輸入!")
modify_user(name, "clear_error")
modify_user(name, "add_error")
else:
# 已鎖定狀態,處于限制時間之內:提示已鎖定
print("您的密碼不正確,賬號已被鎖定,請等候 [%f]s 后重試!" % (lock_time - (time.time() - last_time)))
else:
# 用戶名不匹配
print("您的用戶名未存在!")
def modify_user(name, mode="add_error"):
"""
修改用戶名單中的登錄錯誤次數
:param name: 用戶名稱
:param mode:add_error,登錄錯誤次數自增1;clear_error,登錄錯誤次數重置為0
:return:
"""
# 載入用戶數據
user_items = load_user()
user_obj = user_items.get(name)
if user_obj:
if mode=="clear_error":
# 清空錯誤次數與鎖定時間
user_obj["errors"]=0
user_obj["lock_time"]=0.0
else:
# 錯誤次數自增1,如果錯誤次數==3時,添加鎖定時間
errors = int(user_obj.get("errors"))+1
user_obj["errors"]=errors
if errors==3:
user_obj["lock_time"] = float(time.time())
# print(user_items)
# 將用戶數據(json格式化格式)重新寫入txt文件
with open("user.txt", "w") as fp:
json.dump(user_items,fp,ensure_ascii=False,indent=4)
def login():
"""
登錄
:return:
"""
while True:
user_name = input("Name:")
pwd = input("PASS:")
if auth(user_name, pwd, 120):
break
if __name__ == '__main__':
login()
```
### 參考流程圖

<hr style="margin-top:100px">
:-: 
***微信掃一掃,關注“python測試開發圈”,了解更多測試教程!***
- 前言
- chapter01_開發環境
- chapter02_字符串的使用
- chapter03_列表的使用
- chapter04_字典的使用
- chapter05_數字的使用
- chapter06_元組的使用
- chapter07_集合的使用
- chapter08_輸入輸出
- chapter09_控制流程
- chapter10_實例練習_登錄1
- chapter11_python函數入門
- chapter12_python中的類
- chapter13_輕松玩轉python中的模塊管理
- chapter14_掌握學習新模塊的技巧
- chapter15_通過os模塊與操作系統交互
- chapter16_子進程相關模塊(subprocess)
- chapter17_時間相關模塊(time & datetime)
- chapter18_序列化模塊(json)
- chapter19_加密模塊(hashlib)
- chapter20_文件的讀與寫
- chapter21_階段考核2_登錄
- chapter22_小小算法挑戰(排序&二分法)
- chapter23_用多線程來搞事!
- chapter24_HTTP接口請求(requests)
- chapter25_接口測試框架(pytest)
- chapter26_階段考核3_HTTP接口測試
- chapter27_HTML解析(pyquery)
- chapter28_階段考核4_爬蟲下載網易汽車
- chapter29_python中的那些編碼坑
- chapter30_MySQL數據庫操作
- chapter31 高級特性_迭代器與生成器
- chapter32 高級特性_裝飾器
- chapter33 高級特性_列表處理