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中for循环下的索引变量的作用域
Apr 15 Python
python3抓取中文网页的方法
Jul 28 Python
Collatz 序列、逗号代码、字符图网格实例
Jun 22 Python
python实现简单点对点(p2p)聊天
Sep 13 Python
Python3学习urllib的使用方法示例
Nov 29 Python
flask中的wtforms使用方法
Jul 21 Python
python面向对象实现名片管理系统文件版
Apr 26 Python
django认证系统 Authentication使用详解
Jul 22 Python
Django框架反向解析操作详解
Nov 28 Python
pytorch 计算ConvTranspose1d输出特征大小方式
Jun 23 Python
python和node.js生成当前时间戳的示例
Sep 29 Python
python如何用matplotlib创建三维图表
Jan 26 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数组传递是值传递而非引用传递概念纠正
2013/01/31 PHP
linux命令之调试工具strace的深入分析
2013/06/03 PHP
php_screw安装使用教程(另一个PHP代码加密实现)
2014/05/29 PHP
Thinkphp调用Image类生成缩略图的方法
2015/03/07 PHP
基于PHP实现的事件机制实例分析
2015/06/18 PHP
thinkPHP实现将excel导入到数据库中的方法
2016/04/22 PHP
php从数据库中读取特定的行(实例)
2017/06/02 PHP
详解php实现页面静态化原理
2017/06/21 PHP
ThinkPHP3.1.x修改成功与失败跳转页面的方法
2017/09/29 PHP
ThinkPHP5&amp;5.1框架关联模型分页操作示例
2019/08/03 PHP
javascript实现动态CSS换肤技术的脚本
2007/06/29 Javascript
可实现多表单提交的javascript函数
2007/08/01 Javascript
jquery动画1.加载指示器
2012/08/24 Javascript
jQuery跨域问题解决方案
2015/08/03 Javascript
讲解JavaScript的Backbone.js框架的MVC结构设计理念
2016/02/14 Javascript
js 获取当前web应用的上下文路径实现方法
2016/08/19 Javascript
JS去除重复并统计数量的实现方法
2016/12/15 Javascript
javascript正则表达式模糊匹配IP地址功能示例
2017/01/06 Javascript
jquery中$.fn和图片滚动效果实现的必备知识总结
2017/04/21 jQuery
基于JS实现一个随机生成验证码功能
2019/05/29 Javascript
JavaScript位置参数实现原理及过程解析
2020/09/14 Javascript
Python连接SQLServer2000的方法详解
2017/04/19 Python
Python基于whois模块简单识别网站域名及所有者的方法
2018/04/23 Python
python实现简单的文字识别
2018/11/27 Python
python 多线程重启方法
2019/02/18 Python
python tkinter基本属性详解
2019/09/16 Python
Python操作多维数组输出和矩阵运算示例
2019/11/28 Python
python中图像通道分离与合并实例
2020/01/17 Python
Python小整数对象池和字符串intern实例解析
2020/03/21 Python
NIHAOMARKET官方海外旗舰店:意大利你好华人超市
2018/01/27 全球购物
万年牢教学反思
2014/02/15 职场文书
教师党员先进性教育自我剖析材料思想汇报
2014/09/24 职场文书
企业开业庆典答谢词
2015/01/20 职场文书
2015医院个人工作总结范文
2015/05/21 职场文书
致接力运动员加油稿
2015/07/21 职场文书
2015年城管执法工作总结
2015/07/23 职场文书