python从入门到精通(DAY 3)


Posted in Python onDecember 20, 2015

要求:编写登陆接口

输入用户名密码
认证成功后显示欢迎信息
输错三次后锁定

针对此实例写了有二种类型的脚本,略有不同,具体如下:

帐号文件account.txt内容如下:

sam 123

david 12
kevin 123
lin 12
tailen 123
jack 12

锁文件account_lock.txt默认为空

一、只针对帐号文件里的用户进行判断并锁定,针对用户和密码各有三次错误重试机会。

1、流程图如下:

python从入门到精通(DAY 3)

代码如下:

#!/usr/bin/python27
#_*_ coding:utf-8 _*_

import sys,os,getpass

os.system('clear')
i = 0
while i < 3:                            #只要用户登录异常不超过3次就不断循环
  name = raw_input("请输入用户名:")

  lock_file = open('account_lock.txt','r+')            #当用户输入用户名后,打开LOCK 文件 以检查是否此用户已经LOCK了
  lock_list = lock_file.readlines()

  for lock_line in lock_list:                   #循环LOCK文件 
    lock_line = lock_line.strip('\n')              #去掉换行符
    if name == lock_line:                    #如果LOCK了就直接退出
      sys.exit('用户 %s 已经被锁定,退出' % name) 

  user_file = open('account.txt','r')               #打开帐号文件 
  user_list = user_file.readlines()                
  for user_line in user_list:                   #对帐号文件进行遍历
    (user,password) = user_line.strip('\n').split()       #分别获取帐号和密码信息
    if name == user:                      #如用户名正常匹配
      j = 0
      while j < 3:                      #只要用户密码异常不超过3次就不断循环
        passwd = getpass.getpass('请输入密码:')       #输入隐藏密码
        if passwd == password:               #密码正确,提示欢迎登录
          print('欢迎登录管理平台,用户%s' % name)    
          sys.exit(0)                   #正常退出
        else:
          print('用户 %s 密码错误,请重新输入,还有 %d 次机会' % (name,2 - j))
        j += 1                       #密码输入错误后,循环值增加1
      else:
        lock_file.write(name + '\n')            #密码输入三次错误后,将该用户追加到LOCK文件
        sys.exit('用户 %s 达到最大登录次数,将被锁定并退出' % name)
    else:
      pass                          #当用户没匹配时,跳过并继续循环
  else:
    print('用户 %s 不存在,请重新输入,还有 %d 次机会' % (name,2 - i))
  i += 1                             #当用户输入错误时,循环值增加1
else:
  sys.exit('用户 %s 不存在,退出' % name)              #用户输入三次错误后,异常退出
      
lock_file.close()                          #关闭LOCK文件
user_file.close()                          #关闭帐号文件

二、针对帐号文件里的不存在的用户也可以进行判断并锁定,针对用户和密码共有三次错误重试机会

代码如下:

#_*_ coding:utf-8 _*_

import sys,os,getpass

os.system('clear')

retry_limit = 3
retry_count = 0

account_file = 'account.txt'
lock_file = 'account_lock.txt'

while retry_count < retry_limit:                     #只要重试不超过3次就不断循环
  username = raw_input('\033[31;43mUsername:\033[0m')
  username = username.strip()
  lock_check = open(lock_file)                     #当用户输入用户名后,打开LOCK 文件 以检查是否此用户已经LOCK了

  for line in lock_check.readlines():                 #循环LOCK文件 
    if username == line.strip('\n'):                 #去掉换行符
      sys.exit('\033[35mUser %s is locked!!!\033[0m' % username)  #如果LOCK了就直接退出
  password = raw_input('\033[32;41mPassword:\033[0m')         #输入密码

  f = open(account_file,'r')                      #打开帐号文件 
  match_flag = False                          # 默认为Flase,如果用户match 上了,就设置为 True

  for line in f.readlines():                      
    user,passwd = line.strip('\n').split()              #去掉每行多余的\n并把这一行按空格分成两列,分别赋值为user,passwd两个变量
    if username == user and password == passwd:           #判断用户名和密码是否都相等
      print('hello, %s !!' % username)
      match_flag = True                       #相等就把循环外的match_flag变量改为了True
      break                             #然后就不用继续循环了,直接 跳出,因为已经match上了
  f.close()

  if match_flag == False:                       #如果match_flag还为False,代表上面的循环中跟本就没有match上用户名和密码,所以需要继续循环
    print('sorry,%s is unmatched' % username)
    retry_count += 1                         #计数器加1
  else:
    print('wlecome login my learning system!')
    break                              #用户成功登录,退出脚本

else:
  print("you account %s is locked!!!" % username)
  g = open(lock_file,'a')
  g.write(username)                          #被锁用户追加到用户锁文件
  g.write('\n')  
  g.close()
Python 相关文章推荐
python 算法 排序实现快速排序
Jun 05 Python
python二分法实现实例
Nov 21 Python
为Python的web框架编写MVC配置来使其运行的教程
Apr 30 Python
python保存字符串到文件的方法
Jul 01 Python
Python设置Socket代理及实现远程摄像头控制的例子
Nov 13 Python
Python基于Flask框架配置依赖包信息的项目迁移部署
Mar 02 Python
Python GUI Tkinter简单实现个性签名设计
Jun 19 Python
python删除列表元素的三种方法(remove,pop,del)
Jul 22 Python
pytorch masked_fill报错的解决
Feb 18 Python
python小白切忌乱用表达式
May 29 Python
python设置表格边框的具体方法
Jul 17 Python
python开发实时可视化仪表盘的示例
May 07 Python
python从入门到精通(DAY 2)
Dec 20 #Python
利用python代码写的12306订票代码
Dec 20 #Python
python从入门到精通(DAY 1)
Dec 20 #Python
在DigitalOcean的服务器上部署flaskblog应用
Dec 19 #Python
用ReactJS和Python的Flask框架编写留言板的代码示例
Dec 19 #Python
使用Python编写简单的端口扫描器的实例分享
Dec 18 #Python
十个Python程序员易犯的错误
Dec 15 #Python
You might like
php程序内部post数据的方法
2015/03/31 PHP
php实现用手机关闭计算机(电脑)的方法
2015/04/22 PHP
PHP模糊查询技术实例分析【附源码下载】
2019/03/07 PHP
PHP SESSION机制的理解与实例
2019/03/22 PHP
laravel 错误处理,接口错误返回json代码
2019/10/25 PHP
jquery控制listbox中项的移动并排序
2009/11/12 Javascript
Javascript 面向对象 命名空间
2010/05/13 Javascript
jQuery EasyUI API 中文文档 - Dialog对话框
2011/11/15 Javascript
Js判断参数(String,Array,Object)是否为undefined或者值为空
2013/11/04 Javascript
JavaScript中使用ActiveXObject操作本地文件夹的方法
2014/03/28 Javascript
Jquery操作js数组及对象示例代码
2014/05/11 Javascript
jQuery中ajax的post()方法用法实例
2014/12/26 Javascript
JQuery中上下文选择器实现方法
2015/05/18 Javascript
Angularjs全局变量被作用域监听的正确姿势
2016/02/06 Javascript
jQuery原理系列-常用Dom操作详解
2016/06/07 Javascript
js es6系列教程 - 新的类语法实战选项卡(详解)
2017/09/02 Javascript
vue中实现滚动加载更多的示例
2017/11/08 Javascript
layui 表格的属性的显示转换方法
2018/08/14 Javascript
浅谈Fetch 数据交互方式
2018/12/20 Javascript
Python统计日志中每个IP出现次数的方法
2015/07/06 Python
浅谈python中set使用
2016/06/30 Python
python将文本中的空格替换为换行的方法
2018/03/19 Python
解决Python内层for循环如何break出外层的循环的问题
2019/06/24 Python
Python3实现二叉树的最大深度
2019/09/30 Python
Pycharm中切换pytorch的环境和配置的教程详解
2020/03/13 Python
python numpy矩阵信息说明,shape,size,dtype
2020/05/22 Python
python图片验证码识别最新模块muggle_ocr的示例代码
2020/07/03 Python
详解Open Folder as PyCharm Project怎么添加的方法
2020/12/29 Python
html5给汉字加拼音加进度条的实现代码
2020/04/07 HTML / CSS
李宁官方网店:中国运动品牌
2017/11/02 全球购物
Chinti & Parker官网:奢华羊绒女装和创新针织设计
2021/01/01 全球购物
工业学校毕业生自荐书
2014/01/03 职场文书
酒会邀请函
2015/01/31 职场文书
Go timer如何调度
2021/06/09 Golang
详解在SQLPlus中实现上下键翻查历史命令的功能
2022/03/18 SQL Server
使用CSS自定义属性实现骨架屏效果
2022/06/21 HTML / CSS