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基础教程之基本内置数据类型介绍
Feb 20 Python
Python实现二维有序数组查找的方法
Apr 27 Python
Python 实现随机数详解及实例代码
Apr 15 Python
Python通过命令开启http.server服务器的方法
Nov 04 Python
对python遍历文件夹中的所有jpg文件的实例详解
Dec 08 Python
Python自定义一个异常类的方法
Jun 27 Python
Python环境Pillow( PIL )图像处理工具使用解析
Sep 12 Python
python用WxPython库实现无边框窗体和透明窗体实现方法详解
Feb 21 Python
解决PyCharm IDE环境下,执行unittest不生成测试报告的问题
Sep 03 Python
django上传文件的三种方式
Apr 29 Python
解决IDEA翻译插件Translation报错更新TTK失败不能使用
Apr 24 Python
Python如何用re模块实现简易tokenizer
May 02 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读取txt文件的内容并赋值给数组的代码
2011/11/03 PHP
php中的Base62类(适用于数值转字符串)
2013/08/12 PHP
简单实用的PHP防注入类实例
2014/12/05 PHP
php实现字符串翻转的方法
2015/03/27 PHP
YII2.0框架行为(Behavior)深入详解
2019/07/26 PHP
php+js实现的拖动滑块验证码验证表单操作示例【附源码下载】
2020/05/27 PHP
JavaScript 实现简单的倒计时弹窗DEMO附图
2014/03/05 Javascript
自己实现ajax封装示例分享
2014/04/01 Javascript
jquery库或JS文件在eclipse下报错问题解决方法
2014/04/17 Javascript
JavaScript中的值是按值传递还是按引用传递问题探讨
2015/01/30 Javascript
jquery实现漫天雪花飞舞的圣诞祝福雪花效果代码分享
2015/08/20 Javascript
XML、HTML、CSS与JS的区别整理
2016/02/18 Javascript
JavaScript位移运算符(无符号) &gt;&gt;&gt; 三个大于号 的使用方法详解
2016/03/31 Javascript
JavaScript核心语法总结(推荐)
2016/06/02 Javascript
非常实用的vue导航钩子
2017/03/20 Javascript
微信小程序实战之轮播图(3)
2017/04/17 Javascript
教你5分钟学会用requirejs(必看篇)
2017/07/25 Javascript
对angularJs中ng-style动态改变样式的实例讲解
2018/09/30 Javascript
使用异步controller与jQuery实现卷帘式分页
2019/06/18 jQuery
Layui实现主窗口和Iframe层参数传递
2019/11/14 Javascript
javascript中导出与导入实现模块化管理教程
2020/12/03 Javascript
Django实现全文检索的方法(支持中文)
2018/05/14 Python
postman模拟访问具有Session的post请求方法
2019/07/15 Python
简单了解python变量的作用域
2019/07/30 Python
python 中xpath爬虫实例详解
2019/08/26 Python
Python实现生成密码字典的方法示例
2019/09/02 Python
Python MySQL 日期时间格式化作为参数的操作
2020/03/02 Python
python实现MySQL指定表增量同步数据到clickhouse的脚本
2021/02/26 Python
普罗米修斯教学反思
2014/02/06 职场文书
物业管理毕业生的自我评价
2014/02/17 职场文书
出生公证委托书
2014/04/03 职场文书
文秘自荐信
2014/06/28 职场文书
驾驶员安全责任书
2014/07/22 职场文书
2016年教师政治思想表现评语
2015/12/02 职场文书
Python快速优雅的批量修改Word文档样式
2021/05/20 Python
Redis基本数据类型Zset有序集合常用操作
2022/06/01 Redis