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中__getattr__和 __getattribute__获取属性的用法
Jun 21 Python
Python排序算法实例代码
Aug 10 Python
深入理解Django中内置的用户认证
Oct 06 Python
简单实现python收发邮件功能
Jan 05 Python
Python 实现引用其他.py文件中的类和类的方法
Apr 29 Python
python执行精确的小数计算方法
Jan 21 Python
Python实现去除图片中指定颜色的像素功能示例
Apr 13 Python
PyQt4编程之让状态栏显示信息的方法
Jun 18 Python
Python实现的对一个数进行因式分解操作示例
Jun 27 Python
python配置文件写入过程详解
Oct 19 Python
pandas中read_csv的缺失值处理方式
Dec 19 Python
python实现二分类和多分类的ROC曲线教程
Jun 15 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中$_SERVER的详细参数与说明介绍
2013/10/26 PHP
使用 PHPStorm 开发 Laravel
2015/03/24 PHP
PHP实现搜索相似图片
2015/09/22 PHP
thinkPHP模型初始化实例分析
2015/12/03 PHP
mac下多个php版本快速切换的方法
2016/10/09 PHP
详谈php中 strtr 和 str_replace 的效率问题
2017/05/14 PHP
php使用curl伪造来源ip和refer的方法示例
2018/05/08 PHP
js获取元素在浏览器中的绝对位置
2010/07/24 Javascript
javascript下string.format函数补充
2010/08/24 Javascript
javascript之querySelector和querySelectorAll使用介绍
2011/12/20 Javascript
javascript操作数组详解
2014/12/17 Javascript
jquery插件corner实现圆角边框的方法
2015/03/09 Javascript
swtich/if...else的替代语句
2015/08/16 Javascript
js实现的黑背景灰色二级导航菜单效果代码
2015/08/24 Javascript
Angularjs 制作购物车功能实例代码
2016/09/14 Javascript
Node.js + Redis Sorted Set实现任务队列
2016/09/19 Javascript
详解Node项目部署到云服务器上
2017/07/12 Javascript
JS设计模式之策略模式概念与用法分析
2018/02/05 Javascript
微信小程序input框中加入小图标的实现方法
2018/06/19 Javascript
详解小程序输入框闪烁及重影BUG解决方案
2018/08/31 Javascript
微信小程序实现多选框全选与取消全选功能示例
2019/05/14 Javascript
小程序实现日历左右滑动效果
2019/10/21 Javascript
原生JavaScript实现弹幕组件的示例代码
2020/10/12 Javascript
python操作列表的函数使用代码详解
2017/12/28 Python
python下解压缩zip文件并删除文件的实例
2018/04/24 Python
详解Python下Flask-ApScheduler快速指南
2018/11/04 Python
使用批处理脚本自动生成并上传NuGet包(操作方法)
2019/11/19 Python
3D动画《斗罗大陆》上线当日播放过亿
2021/03/16 国漫
ghd官网:英国ghd直发器品牌
2018/05/04 全球购物
编写一个 C 函数,该函数在一个字符串中找到可能的最长的子字符串,且该字符串是由同一字符组成的
2015/07/23 面试题
大学生最新职业生涯规划书范文
2014/01/12 职场文书
廉洁使者实施方案
2014/03/29 职场文书
音乐教师求职信
2014/06/28 职场文书
优秀中职教师事迹材料
2014/08/26 职场文书
2014教育局对照检查材料思想汇报
2014/09/23 职场文书
如何获取numpy array前N个最大值
2021/05/14 Python