百万年薪python之路 -- 模拟三次账号登录锁定功能
用代码实现三次用户登录及锁定(选做,时间充足建议做一做)
项目分析:
一.首先程序启动,显示下面内容供用户选择:
1.注册
2.登录
a.用户选择登录的时候,首先判断用户名在userinfo.txt表中存在不在,存在就不能进行注册
b.当注册的用户名不存在的时候将用户名和密码写入到userinfo.txt文件中
c.用户选择登录的时候,判断用户输入的账号和密码是否userinfo.txt存储的一致
d.用户名和密码一致就终止循环,并提示用户登录成功!
e.用户名和密码不一致,只有三次登录机会,三次过后提示用户名被锁定,请联系管理员!并终止循环
f.当用户名输出三次,再次运行程序.登录锁定的账号继续提示用户名被锁定,请联系管理员!
import os
count = 0
dic = {}
def locked(login_user,count = 3):
with open("userinfo.txt", "r", encoding="UTF-8") as f4, open("userinfo_bak.txt", "w", encoding="UTF-8") as f5:
for i in f4:
i = i.strip().split(":")
if i[0] == login_user:
i[0] = i[0].replace(i[0], i[0] + "$")
f5.write(f"{i[0]}:{i[1]}\n")
# print(f"你输错了{count}次!")
print(f"检测到用户名{login_user}已经输错了{count}次,已锁定!请联系管理员!")
os.remove("userinfo.txt")
os.rename("userinfo_bak.txt", "userinfo.txt")
def user_login_count(login_user):
with open("userinfo.txt", "r", encoding="UTF-8") as f:
for i in f:
i = i.strip().split(":")
if i[0][-1] == "$" and i[0][0:-1] == login_user:
dic[login_user] = 3
if dic.get(login_user,0) != 3:
dic[login_user] = dic.get(login_user,0) + 1
# print(dic[login_user])
return dic[login_user]
def register():
user = input("请输入注册用户名(退出程序请按q/Q):")
if user.lower() == "q":
return "q"
while 1:
pwd = input("请输入注册密码:")
if not pwd.strip():
print("注册密码不能为空!请重新输入!")
else:
break
with open("userinfo.txt", "r", encoding="UTF-8") as f:
flag = True
for i in f:
i = i.split(":")
if user == i[0]:
print("用户名已存在!")
flag = False
if flag == True:
with open("userinfo.txt", "a", encoding="UTF-8") as f1:
f1.write(user + ":" + pwd + "\n")
print("注册成功!")
def login():
flag = False
while 1:
login_user = input("请输入登录用户名(退出程序请按q/Q):")
if login_user.lower() == "q":
return "q"
login_pwd = input("请输入登录密码:")
with open("userinfo.txt","r",encoding="UTF-8") as f:
for i in f:
i = i.strip().split(":")
if i[0][-1] == "$" and i[0][0:-1] == login_user:
print(f"用户名{login_user}已被锁!")
break
elif i[0] == login_user and i[1] == login_pwd:
flag = True
break
if flag != True:
ret = user_login_count(login_user)
if ret == 3:
locked(login_user)
else:
print(f"登陆失败,你已经输错{ret}次了!")
else:
print("登陆成功!")
dic[login_user] = 0
break
while 1:
inp = input("请输入序号(1/注册,2/登录,q或Q/退出程序):")
if inp == "1" or inp == "2" or inp.lower() == "q":
if inp == "1":
if register() == "q":
break
elif inp == "2":
if login() == "q":
break
elif inp.lower() == "q":
print("已退出程序!")
break
else:
print("请重新输入!")
百万年薪python之路 -- 模拟三次账号登录锁定功能的更多相关文章
- 百万年薪python之路 -- 模块三
logging 日志模块 loggin模块参数 灵活配置日志级别,日志格式,输出位置: import logging logging.basicConfig(level=logging.DEBUG, ...
- 百万年薪python之路 -- 软件的开发规范
一. 软件的开发规范 什么是开发规范?为什么要有开发规范呢? 你现在包括之前写的一些程序,所谓的'项目',都是在一个py文件下完成的,代码量撑死也就几百行,你认为没问题,挺好.但是真正的后端开发的项目 ...
- 百万年薪python之路 -- 并发编程之 多进程二
1. 僵尸进程和孤儿进程 基于unix的环境(linux,macOS) 主进程需要等待子进程结束之后,主进程才结束 主进程时刻检测子进程的运行状态,当子进程结束之后,一段时间之内,将子进程进行回收. ...
- 百万年薪python之路 -- 并发编程之 多线程 三
1. 阻塞,非阻塞,同步,异步 进程运行的三个状态: 运行,就绪,阻塞. 从执行的角度: 阻塞: 进程运行时,遇到IO了,进程挂起,CPU被切走. 非阻塞: 进程没有遇到IO 当进程遇到IO, ...
- 百万年薪python之路 -- 数据库初始
一. 数据库初始 1. 为什么要有数据库? 先来一个场景: 假设现在你已经是某大型互联网公司的高级程序员,让你写一个火车票购票系统,来hold住十一期间全国的购票需求,你怎么写? 由于在同一时 ...
- 百万年薪python之路 -- 并发编程之 协程
协程 一. 协程的引入 本节的主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发,为此我们需要先回顾下并发的本质:切换+保存状态 cpu正在运行一个任务,会在两 ...
- 百万年薪python之路 -- MySQL数据库之 Navicat工具和pymysql模块
一. IDE工具介绍(Navicat) 生产环境还是推荐使用mysql命令行,但为了方便我们测试,可以使用IDE工具,我们使用Navicat工具,这个工具本质上就是一个socket客户端,可视化的连接 ...
- 百万年薪python之路 -- 面向对象之继承
面向对象之继承 1.什么是面向对象的继承 继承(英语:inheritance)是面向对象软件技术当中的一个概念. 通俗易懂的理解是:子承父业,合法继承家产 专业的理解是:子类可以完全使用父类的方法和属 ...
- 百万年薪python之路 -- JS基础介绍及数据类型
JS代码的引入 方式1: <script> alert('兽人永不为奴!') </script> 方式2:外部文件引入 src属性值为js文件路径 <script src ...
随机推荐
- [LeetCode] 面试题之犄角旮旯 第叁章
题库:LeetCode题库 - 中等难度 习题:网友收集 - zhizhiyu 此处应为一个简单的核心总结,以及练习笔记. 查找一个数“在不在”?桶排序理论上貌似不错. 回文问题 ----> [ ...
- 【linux】【Zookeeper】Centos7安装Zookeeper-3.5.5
一 .下载zookeeper wget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.5.5/apache-zookeeper-3.5.5 ...
- Java StringTokenizer 类使用方法
Java StringTokenizer 属于 java.util 包,用于分隔字符串. StringTokenizer 构造方法: 1. StringTokenizer(String str) :构 ...
- [技术栈]CRC校验原理及C#代码实现CRC16、CRC32计算FCS校验码
1.CRC.FCS是什么 CRC,全称Cyclic Redundancy Check,中文名称为循环冗余校验,是一种根据网络数据包或计算机文件等数据产生简短固定位数校验码的一种信道编码技术,主要用来检 ...
- shell判断文件目录或文件是否存在
1.文件描述符 -e 判断对象是否存在 -d 判断对象是否存在,并且为目录 -f 判断对象是否存在,并且为常规文件 -L 判断对象是否存在,并且为符号链接 -h 判断对象是否存在,并且为软链接 -s ...
- 阿里云服务器ecs配置之安装nginx
一.简介 Nginx是一款轻量级的网页服务器.反向代理服务器.相较于Apache.lighttpd具有占有内存少,稳定性高等优势.它最常的用途是提供反向代理服务. 二 .安装 1.准备工作 Nginx ...
- MongoDB的基本操作(增删改查)
目录 概念整理 数据库:一个MongoDB中可以建立多个数据库. 集合:MongoDB的文档组. 文档:实际存放数据的地方. 常见的操作 数据库(新增,删除) 集合(新增,编辑,删除) 文档(增删 ...
- .net core 3.0 Signalr - 02 使用强类型的Hub
## 强类型的优缺点 - 优点 强类型的Hub可以避免魔法函数名,相比弱类型更容易维护和发现问题,直接上代码 - 缺点 特么的得多些好几行代码 ## 代码 ### 接口定义 ``` C# /// // ...
- Scala XML
XML 直接在代码中使用 XML 字面量 val doc: Elem = <html><head><title>Test</title></hea ...
- Postgressql高可用(pgpool+异步流复制)
文档结构: 由于博主之前是Oracle dba,oracle 高可用一般是rac,以及搭建ADG,一个是基于实例的高可用,一个是基于数据的容灾,甚至也有rac+adg的方式.Postgres有同步和异 ...