day1 作业编写登录窗口
作业一:编写登录接口
(1)输入用户名和密码;
(2)认证成功后显示欢迎信息;
(3)输错三次后锁定。
思路:我们知道,要想让程序记住之前输入多少次,锁定用户,那么可以使用数据库来保存用户的状态,然而,数据库的知识还没有学习,因此我们要使用文件来保存文件。持久化保存数据信息,要保存在硬盘中。
(1)登陆,三次登陆锁定用户
用户信息文件 (用文件存储用户信息)
黑名单文件
1.黑名单检测,不让登陆
2.用户名密码判定
readme:
1.让用户输入用户名,首先在锁定列表中进行查找,查看用户是否进行锁定,如果用户没有在锁定文件中,那么在尝试看用户是否在用户文件中,如果输入的用户在文件中,则让用户输入密码,对密码进行判断,如果密码等于对应的用户的话就满足认证,让用户登陆成功,如果输入错误,则让用户重新输入,如果三次都没有成功,则锁定这个用户。
2.在上面的思路中,我们可以遍历文件,把用户的信息存放在一个字典中,到时候只需要根据用户输入的用户名作为键,然后匹配对应的密码,看是否与用户输入的密码等同即可。
3.我们也可以添加一个注册模块,如果用户不在用户文件中,则提示让注册,注册之后再登陆。
为此:我们采用两种方式进行尝试,一种是从上而下的编程;第二种是函数式编程方式:
流程图如下:

上面流程图是登录的过程,下面来编写代码:
#现有两个文件,一个lock_user,用于存储用户列表,一个lock_file用于锁定用户
#要想使用常规方法来造成多次输入的情况,必须使用while函数循环,为此,我们设置一个标识符,用来结束循环 active = True
#设置标识符,用于结束真个循环,当我们想结束整个循环的时候,可以让表示符为false
user_dic = {}
#定义一个空字典,用于存储未锁定用户的用户名和密码
lock_dic = {}
#定义一个用于存储锁定用户的空字典
i =
while active:
username = input("Please input your name:")
#让用户输入用户名
with open("lock_user","r") as f:
#打开文件,并且遍历文件的每一行,用户把用户信息存储到字典中,以我们熟悉的方式处理
for line in f.readlines():
user,password = line.strip().split(":")
#读取文件的每一行,并且分割字符串,生成用户名和密码存储在下面字典中
lock_dic[user] = password
if username in lock_dic.keys():
#判断用户名是否在锁定列表中,如果在退出
print("对不起,你输入的用户名已经被锁定,请联系管理员......")
break
else:
pass
with open("user_list","r") as f1:
#打开文件,目的是判断用户是否注册
for line1 in f1.readlines():
user1,pwd = line1.strip().split(":")
user_dic[user1] = pwd
while active:
if username in user_dic:
#判断用户是否注册,如果注册了,就让用户输入密码
if i < :
#给用户三次机会
input_pwd = input("Pleae input your password:")
if input_pwd == user_dic[username]:
print("登录成功,欢迎回来!")
exit()
else:
if i == :
#如果第三次用户还没有输对,则把用户从用户文件移除到锁定文件中
print("对不起,你输入的次数过多,你的账户已经被锁定,请联系管理员")
with open("lock_user", "a") as f3:
f3.write("\n%s:%s" % (username, user_dic[username]))
with open("user_list","r+") as f4:
lines = f4.readlines()
if ("%s:%s\n" %(username,user_dic[username])) in lines:
lines.remove(("%s:%s\n" %(username,user_dic[username])))
else:
lines.remove(("%s:%s" %(username,user_dic[username])))
#逐行读取文件信息
f4.writelines(lines)
active = False
else:
print("您还有%s次机会输入,如果都没输对,系统将索斯能够你的用户名" %(-i))
i +=
else:
#如果用户没有注册,让用户这测,并且把注册后的用户添加到新的列表中
print("您输入的用户没有注册,请注册")
log_user = input("Please input your login in name:")
log_pwd = input("Please input your log password:")
with open("user_list","a") as f2:
f2.write("\n%s:%s" %(log_user,log_pwd))
print("注册成功,欢迎您的加入!")
active = False
上面代码中,主要用的是对文件的操作,文件的操作我掌握的还不是很熟练,另外我们在读取文件的时候,大家都经常遇到恶心的应该就是空行吧!我们在遍历文件的时候,如果使用split()方法分隔,遇到空行的时候会报错,因为分隔不了,没有参数提供给我们的变量,这个时候可以事先做个判断,而且文件的操作使用w+写读模式容易一不小心把后台文件内容清楚,被boss开除,因为文件的操作本人不是怎么喜欢。空行的问题可以使用if进行判断,如果遇到空行,回避掉。函数式编程程序如下:
import getpass
#导入模块,用于让用户输入密码处于隐藏状态
def locked_user(username):
#查看用户是否锁定
lock_users = []
#定义一个空的列表,用于存储锁定用户信息
with open("lock_file","r") as f:
#打开文件
for line in f.readlines():
#逐行读取文件信息
if line.strip():
#对文件进行判断,判断是否是空行,因为空行的时候会报错
lock_user,lock_pwd = line.strip().split(":")
#字符串分割,生成用户名和密码,用户名存放在一个列表中进行验证是否锁定
lock_users.append(lock_user)
else:
pass
if username in lock_users:
#用户在锁定列表中告诉用户已经锁定
print("您输入的用户已经被锁定,请联系管理员!")
else:
#用户没有锁定,返回用户名进行接下来用户是否注册的验证
return username def isregister(username):
#验证是否注册
user_dic = {}
#定义一个空字典,用于存放用户名和密码
users = []
#定义一个空的列表,用于存储用户名
with open("user_file","r") as f1:
for line1 in f1.readlines():
if line1.strip():
users1,pwd1 = line1.strip().split(":")
#字符串分割,生成用户名和密码
user_dic[users1] = pwd1
#生成用户名和密码字典
users.append(users1)
#把用户名以及对应的密码存放在一个字典中
else:
pass
if username in user_dic.keys():
#判断用户名是否在用户列表中,在进行验证
i =
while i < :
pwd = input("请输入你的用户密码:")
if user_dic[username] == pwd:
print("欢迎回来!")
return False
else:
if i == :
print("对不起,您输入的次数过多,你的用户名已经被锁定,请联系管理员!")
# 用户名锁定之后要把锁定用户添加到锁定列表中,从user_file中剔除
with open("user_file", "r+") as f3:
lines = f3.readlines()
num = users.index(username)
lines.pop(num)
f3.writelines(lines)
with open("lock_file", "a") as f4:
f4.write("\n%s:%s" % (username, pwd))
return False
else:
print("您输入的密码不对,你还有%s次机会..." % ( - i))
i +=
else:
#不在让用户注册
print("您输入的用户没有注册,请注册!")
register(rigister_name = input("请输入你要注册的用户名:"),rigister_pwd = getpass.getpass("请输入您的密码")) def register(rigister_name,rigister_pwd):
#用户注册账号,注册之后添加到用户列表中,且打印一条注册成功的消息,结束过程
with open("user_file","a") as f2:
f2.write("\n%s:%s" %(rigister_name,rigister_pwd)) print("注册成功,欢迎您!")
return False active = True
#定义一个标识符,用于开启结束循环
while active:
username = input("请输入您的用户名::")
locked_user(username)
active = isregister(username)
上面代码基本上能够满足要求,能够验证是否锁定,是否注册,没有注册让用户注册,注册之后添加到用户列表中;注册输入密码,密码三次后锁定,从用户文件删除,添加到锁定文件;但是用户文件哪里有一点小bug,因为我不知道如何读取一个文件删除之后在添加,因为"w"模式打开文件后直接清空文件,他妈的,操。而"r+"模式打开后,如果在添加信息进去的话,之前的信息还存在。造成没有删除的用户重复。
在读取文件中也经常会遇到空格这种恶心的操作,真心不喜欢呀。不过可以使用if函数对空格进行判断,判断空格的位置。
day1 作业编写登录窗口的更多相关文章
- day1作业:编写登录窗口一个文件实现
思路: 1.参考模型,这个作业我参考了linux的登录认证流程以及结合网上银行支付宝等锁定规则: 1)认证流程参考的是Linux的登录:当你输入完用户名密码后再验证用户名是否存在用户是否被锁定,然后在 ...
- day1作业:登录接口
作业一:编写登陆接口 1.输入用户名和密码 2.认证成功后显示欢迎信息 3.输错三次后锁定 思路: (1)用户输入用户名: (2)去锁定文件中验证用户名是否锁定: (3)去当前用户验证用户是否存在: ...
- Day1作业-模拟登录
# /usr/bin/env python# -*- coding: utf-8 -*-# Author:jenvid.yangimport getpassimport shutiluserspwd ...
- python基础一之课后作业:编写登录接口
1 # Author : Mamba 2 3 #python基础一之课后作业:编写登录接口 4 5 # 输入用户名密码 6 # 认证成功后显示欢迎信息 7 # 用户名3次输入错误后,退出程序 8 # ...
- Day1作业---登录接口及多级菜单
#!/usr/bin/env python # -*- coding:utf-8 -*- # Author:Ma Qing data = { "山东" :{ "济南&qu ...
- 【2017-04-24】winform基础、登录窗口、窗口属性
一.winform基础 客户端应用程序:C/S 客户端应用程序可以操作用户电脑中的文件,代码要在用户电脑上执行,吃用户电脑配置. 窗体是由控件和属性做出来的 控件:窗体里所放的东西."视图 ...
- Day1作业要求
Day1作业 作业需求 博客 模拟登录 三级菜单 博客地址 杨振伟Day1博客地址 模拟登录 1.程序说明 实现功能如下 用户输入密码,密码验证后登录成功 用户登录成功后提示登录信息 用户输入3次错误 ...
- C# 登录窗口的设计技巧
记得很久之前要用C#做个需要登录的小东西,自己之前完全没有编写WinForm的经验,整个过程中,自己感觉应该怎么写就怎么写,时常导致许多逻辑性的错误,比如在做这个登录窗口的时候,应该实现的效果是,用户 ...
- (转)python编写登录接口
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://506554897.blog.51cto.com/2823970/1907262 ...
随机推荐
- Win8Metro(C#)数字图像处理--2.40二值图像轮廓提取
http://dongtingyueh.blog.163.com/blog/static/4619453201271481335630/ [函数名称] 二值图像轮廓提取 Contour ...
- BMP格式图像读取与存储
全局变量: 1 #include "stdafx.h" #include <windows.h> /*BMP位图数据是4字节对齐*/ #define WIDTHBYTE ...
- 简化版SMO算法标注
''' 随机选择随机数,不等于J ''' def selectJrand(i,m): j=i #we want to select any J not equal to i while (j==i): ...
- 树莓派apt-get下载网速太慢
因为学校有ipv6的原因,当我想用ipv4的时候用apt-get发现特别慢.找了很久终于找到了解决方案: Add -o Acquire::ForceIPv4=true when running apt ...
- 手脱FSG v1.33
1.载入PEID FSG v1.33 (Eng) -> dulek/xt 2.载入OD,先F8跟一会 004103E3 > BE A4014000 mov esi,fsg1_33.0040 ...
- oracle导入提示IMP-00013: 只有 DBA 才能导入由其他 DBA 导出的文件
oracle导入提示:IMP-00013: 只有 DBA 才能导入由其他 DBA 导出的文件IMP-00000: 未成功终止导入 解决办法:用户缺少导入权限,授予用户导入权限grant imp_ful ...
- Spring Boot + Swagger
前言: 在互联网公司, 微服务的使用者一般分为两种, 客户端和其他后端项目(包括关联微服务),不管是那方对外提供文档 让别人理解接口 都是必不可少的.传统项目中一般使用wiki或者文档, 修改繁琐,调 ...
- Elasticsearch——QueryBuilder简单查询
elasticsearch中存储的全部文档 1.matchAllQuery() matchAllQuery()方法用来匹配全部文档 public class QueryTest { pub ...
- Web 开发者易犯的5大严重错误
无论你是编程高手,还是技术爱好者,在进行Web开发过程中,总避免不了犯各种各样的错误. 犯了错误,可以改正.但如果犯了某些错误,则会带来重大损失.遗憾.令人惊讶的是,这些错误往往是最普通,最容易避免. ...
- C语言与汇编语言对照分析
游戏通常会包含各种各样的功能,如战斗系统.UI渲染.经济系统.生产系统等,每个系统又包含各式各样子功能,如伤害判定.施法.使用道具.角色移动.玩家之间交易等等.这些游戏功能在代码实现中往往少不了条件判 ...