作业一:编写登陆接口

1.输入用户名和密码

2.认证成功后显示欢迎信息

3.输错三次后锁定

思路:

(1)用户输入用户名;

  (2)去锁定文件中验证用户名是否锁定;

  (3)去当前用户验证用户是否存在;

  (4)用户输入密码,三次输错后锁定

(5)锁定之后从当前文件中删除用户名,添加到锁定文件中。

注意文件的读取、修改、写入操作,这些操作是要借助列表来完成的,不然就会导致一些不必要的错误,最后定义一个函数来完成这些操作,使用的时候调用这些函数就可以了。

列表文件的操作一定要注意换行的处理,如何添加元素进去,这些方法最好借助于列表和字典来读取写入文件,这样能够保持格式的整齐。

代码如下:

import os,sys,getpass,collections
retry_limit = #密码错误三次被锁定
retry_count = #起始次数是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 = True
if __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:
pass
if username == "quit":
sys.exit() with open("account.txt") as active_f:
users_dict = collections.OrderedDict()
for line in active_f:
user,pwd = line.strip().split()
users_dict[user] = pwd if username in users_dict.keys():
while retry_count < retry_limit:
passwd = getpass.getpass("请输入你的密码:") # 隐藏式输入密码
# 判断用户是否在用户列表中
if users_dict[username] == passwd:
print("欢迎回来,认证成功!")
break
else:
if retry_count != :
#提示用户注意,还有几次机会将被锁定
print("您输入的密码不对,您还有%d次机会,否则系统将被锁定!" % ( - retry_count))
retry_count += else:
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("对不起,您输入的用户不存在,请重新输入!!!")

上面代码实现了登录接口的功能,但是有一些小小的瑕疵,就是锁定文件的写入不是很好,会出现两个空行的情形,这种方式就只能写读取之前的文件,放到一个列表中,然后把锁定用户添加到这个列表,重新再次读入文件,下面将对代码进行修正。

 import os,sys,getpass,collections

 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 = True
if __name__ == "__main__":
while True:
retry_limit = # 密码错误三次被锁定,每次循环重置
retry_count = # 起始次数是0次,每次循环重置次数
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("您好,你的用户已经被锁定,请联系管理员!")
break #如果用户锁定,结束当前循环,执行下一次用户输入
else:
pass
if username == "quit":
sys.exit() with open("account.txt") as active_f:
users_dict = collections.OrderedDict()
for line in active_f:
user,pwd = line.strip().split()
users_dict[user] = pwd if username in users_dict.keys():
while retry_count < retry_limit:
passwd = input("请输入你的密码:") # 隐藏式输入密码
# 判断用户是否在用户列表中
if users_dict[username] == passwd:
print("欢迎回来,认证成功!")
break
else:
if retry_count != :
#提示用户注意,还有几次机会将被锁定
print("您输入的密码不对,您还有%d次机会,否则系统将被锁定!" % ( - retry_count))
retry_count += else:
print("您输入的次数过多,%s已被锁定,请联系管理员" %username) #用户锁定之后,要把锁定的用户从当前文件删除,移到锁定文件中
users_dict.pop(username)
locked_user(users_dict,"account.txt")
with open("account_lock.txt","r") as a_f:
#先读取文件放入一个列表中,以方便下一次读取
user_lines = a_f.readlines() #按行读取文件
user_messages = []
for user_line in user_lines:
user_messages.append(user_line.strip())
user_messages.append(username) #锁定用户添加到列表中
print(user_messages)
with open("account_lock.txt","w+") as write_f:
#把包含锁定用户的列表重新写会文件中
for user_message in user_messages:
user_message = user_message + "\n"
write_f.write(user_message) else:
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你。

day1作业:登录接口的更多相关文章

  1. Day1作业---登录接口及多级菜单

    #!/usr/bin/env python # -*- coding:utf-8 -*- # Author:Ma Qing data = { "山东" :{ "济南&qu ...

  2. day1作业--登录接口

    作业:编写登陆接口 输入用户名密码 认证成功后显示欢迎信息 输错三次后锁定     知识: 1.循环的使用: 2.continue,break在循环中中断的作用: 3.文件的写入,读取: 4.各基础知 ...

  3. day1作业登录接口总结

    作业一:编写登陆接口 1.输入用户名和密码 2.认证成功后显示欢迎信息 3.输错三次后锁定 上面作业,用了几种思路来解决问题:但是本质上其实都是一样的:核心都是对文件的操作,文件的增删改查:并且这些操 ...

  4. day1作业--登录入口

    作业概述: 编写一个登录入口,实现如下功能: (1)输入用户名和密码 (2)认证成功后显示欢迎信息 (3)输错三次后锁定 流程图: readme: 1.程序配置文件: 黑名单文件blacklist.t ...

  5. Python作业--登录接口

    作业需求: 编写登陆接口 输入用户名密码 认证成功后显示欢迎信息 输错三次后锁定 实现思路: 1.从文件获取用户名密码 2.判断是否在黑名单中 3.验证用户名密码 成功:输出认证成功 错误:判断验证次 ...

  6. python基础一之课后作业:编写登录接口

    1 # Author : Mamba 2 3 #python基础一之课后作业:编写登录接口 4 5 # 输入用户名密码 6 # 认证成功后显示欢迎信息 7 # 用户名3次输入错误后,退出程序 8 # ...

  7. day1 作业编写登录窗口

    作业一:编写登录接口 (1)输入用户名和密码: (2)认证成功后显示欢迎信息: (3)输错三次后锁定. 思路:我们知道,要想让程序记住之前输入多少次,锁定用户,那么可以使用数据库来保存用户的状态,然而 ...

  8. Day1作业要求

    Day1作业 作业需求 博客 模拟登录 三级菜单 博客地址 杨振伟Day1博客地址 模拟登录 1.程序说明 实现功能如下 用户输入密码,密码验证后登录成功 用户登录成功后提示登录信息 用户输入3次错误 ...

  9. (转)python编写登录接口

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://506554897.blog.51cto.com/2823970/1907262 ...

随机推荐

  1. linux(ubuntu) 常用指令

    1.新建文件夹 mkdir mkdir test 2.进入文件夹 cd cd test 3.创建/修改文件 vim vim a.txt 如果不存在a.txt,就会新增a.txt; 如果存在,则修改 先 ...

  2. [spark]-Spark2.x集群搭建与参数详解

    在前面的Spark发展历程和基本概念中介绍了Spark的一些基本概念,熟悉了这些基本概念对于集群的搭建是很有必要的.我们可以了解到每个参数配置的作用是什么.这里将详细介绍Spark集群搭建以及xml参 ...

  3. [Java] 集合框架原理之二:锁、原子更新、线程池及并发集合

    java.util.concurrent 包是在 Java5 时加入的,与 concurrent 的相关的有 JMM及 AbstractQueuedSynchronizer (AQS),两者是实现 c ...

  4. Block的copy时机

    什么时候栈上的Block会复制到堆上呢? 1.调用Block的copy实例方法 2.Block作为函数返回值返回时 3.将Block赋值给附有__strong修饰符id类型的类或Block类型成员变量 ...

  5. 互斥量、条件变量与pthread_cond_wait()函数的使用,详解(一)

    1. 首先pthread_cond_wait 的定义是这样的 The pthread_cond_wait() and pthread_cond_timedwait() functions are us ...

  6. 2017 清北济南考前刷题Day 2 morning

    期望得分:100+30+60=190 实际得分:100+30+30=160 T1 最优方案跳的高度一定是单调的 所以先按高度排序 dp[i][j] 跳了i次跳到j 枚举从哪儿跳到j转移即可 #incl ...

  7. php按照指定顺序的排序

    今天遇到一个需求,需要对一个数组按指定顺序进行排序,最终查到个解决办法: $sort_rule = [5,7,3,1,8,2]; $arr = [1,2,3,5,7,8]; //需求,将数组$arr以 ...

  8. 同一条sql语句,只是改变了搜索的条件,就很慢?

    重建索引: ) 显示索引信息: dbcc showcontig('表名’) 具体参考:http://www.cnblogs.com/bluedy1229/p/3227167.html

  9. [译]Quartz.NET 框架 教程(中文版)2.2.x 之第四课 更多关于Triggers

    第四课 更多关于Triggers 跟作业任务类似,触发器也非常容易使用,但是在你能够充分掌握Quartz之前,你需要知道并理解许多触发器的客户化的参数.前面已经提到过,有许多不同类型的触发器供你选择, ...

  10. 20155310 2016-2017-2 《Java程序设计》第六周学习总结

    20155310 2016-2017-2 <Java程序设计>第六周学习总结 教材学习内容总结 4.1 Y86指令集体系结构 •有8个程序寄存器:%eax.%ecx.%edx.%ebx.% ...