>[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()
```
### 参考流程图
![](https://box.kancloud.cn/a03f4d080a262f55d8c1f6a214e21136_1024x1127.jpg)
<hr style="margin-top:100px">
:-: ![](https://box.kancloud.cn/2ff0bc02ec938fef8b6dd7b7f16ee11d_258x258.jpg)
***微信扫一扫,关注“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 高级特性_列表处理