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 相关文章推荐
在 Django/Flask 开发服务器上使用 HTTPS
Jul 03 Python
使用IPython下的Net-SNMP来管理类UNIX系统的教程
Apr 15 Python
Python多线程结合队列下载百度音乐的方法
Jul 27 Python
解析Python中while true的使用
Oct 13 Python
Python for Informatics 第11章之正则表达式(四)
Apr 21 Python
Python实现批量更换指定目录下文件扩展名的方法
Sep 19 Python
python 剪切移动文件的实现代码
Aug 02 Python
python 3.6.5 安装配置方法图文教程
Sep 18 Python
对Python的交互模式和直接运行.py文件的区别详解
Jun 29 Python
正则给header的冒号两边参数添加单引号(Python请求用)
Aug 09 Python
python实现证件照换底功能
Aug 20 Python
Python闭包的定义和使用方法
Apr 11 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嵌套输出缓冲代码实例
2015/05/12 PHP
python进程与线程小结实例分析
2018/11/11 PHP
PHP PDOStatement::closeCursor讲解
2019/01/30 PHP
使用jquery animate创建平滑滚动效果(可以是到顶部、到底部或指定地方)
2014/05/27 Javascript
根据user-agent判断蜘蛛代码黑帽跳转代码(js版与php版本)
2015/09/14 Javascript
javascript实现dom元素可拖动
2016/03/21 Javascript
jQuery中layer分页器的使用
2017/03/13 Javascript
详谈Node.js之操作文件系统
2017/08/29 Javascript
JavaScript正则表达式的贪婪匹配和非贪婪匹配
2017/09/05 Javascript
cropper js基于vue的图片裁剪上传功能的实现代码
2018/03/01 Javascript
Vue+Jwt+SpringBoot+Ldap完成登录认证的示例代码
2018/05/21 Javascript
JavaScript事件对象深入详解
2018/12/30 Javascript
vue.js中使用echarts实现数据动态刷新功能
2019/04/16 Javascript
VUE.js实现动态设置输入框disabled属性
2019/10/28 Javascript
Javascript实现鼠标点击冒泡特效
2019/12/24 Javascript
jQuery实现二级导航菜单的示例
2020/09/30 jQuery
vue3为什么要用proxy替代defineProperty
2020/10/19 Javascript
Python 3.x 连接数据库示例(pymysql 方式)
2017/01/19 Python
python查看列的唯一值方法
2018/07/17 Python
Ubuntu18.04下python版本完美切换的解决方法
2019/06/14 Python
wxpython自定义下拉列表框过程图解
2020/02/14 Python
keras slice layer 层实现方式
2020/06/11 Python
Pycharm中如何关掉python console
2020/10/27 Python
Python3使用Selenium获取session和token方法详解
2021/02/16 Python
国际花店:Pickup Flowers
2020/04/10 全球购物
Python里面search()和match()的区别
2016/09/21 面试题
举例说明类变量和实例变量的区别
2016/06/30 面试题
小学开学标语
2014/07/01 职场文书
2014教师评职称工作总结
2014/11/10 职场文书
2014三年级班主任工作总结
2014/12/05 职场文书
义诊活动通知
2015/04/24 职场文书
解决Go gorm踩过的坑
2021/04/30 Golang
Redis6.0搭建集群Redis-cluster的方法
2021/05/08 Redis
Python3中最常用的5种线程锁实例总结
2021/07/07 Python
使用logback实现按自己的需求打印日志到自定义的文件里
2021/08/30 Java/Android
V Rising 服务器搭建图文教程
2022/06/16 Servers