实现功能:

  1、用户输入账户密码

  2、验证账户是否存在于黑名单,如果存在于黑名单,则执行1,否则往下执行

  3、验证用户名和密码。

    3.1、如果验证成功,则打印欢迎信息并退出程序;

    3.2、如果用户名存在,但是密码错误,则记录这个账户的错误次数(当前会话有效)

      3.2.1、如果错误次数等于等于3,则将这个用户写入锁定文件保存

  4、当错误次数(用户名存在但是密码错误 + 用户名不存在)大于等于3时,sleep(5),然后重置错误次数

 #!/usr/bin/env python3
__author__ = 'DSOWASP'
import getpass
import time error_count = 0 #认证错误次数,包括用户名错误和用户名正确但是密码错误
error_users = [] #用于存放用户名存在,但是密码错误的列表,存放数据格式如:
# [{'name':'ds','count':1},{'name':owasp','count':2}],当某个用户的count为3时,就把这个
# 用户加到locklist.txt文件中, 由于error_users保存在内存中,因此只有在当前会话有效 flag1 = 0 #0表示用户名不存在,1表示用户名密码正确,2表示用户名正确,但是密码错误
flag2 = 0 #0表示当前用户不存在与error_users中,1当前用户存在于error_users中或error为非空
while True:
username = input("用户名:").strip()
password = input("密码:").strip()
if username == "EXIT": #为了能正确退出程序而设置的
break
flag1 = 0
with open('locklist.txt','r') as f_lock: #验证此用户是否被锁定
u1 = f_lock.read().split("\n")
if u1.count(username) != 0:
print("此账户已被锁定!请选择其他账户登录")
time.sleep(1)
continue
with open('userlist.txt','r') as f_user: #验证用户名和密码
for line in f_user:
user = line.split()[0]
passwd = line.split()[1]
if username == user:
if password == passwd: #用户和密码都正确,设置flag=1
print("Welcome to My Python Page!!!")
flag1 = 1
break
elif flag2 == 1: #密码不对,且当前error_users为非空
flag1 = 2 #用户名正确,但是密码不对
for i in error_users: #判断这个用户是否已存在于error_users中
# print("循环字典1",error_users)
if username == i.get("name"): #在error_users中找到了这个账户
# print("找到字典元素:",username,error_users)
flag2 = 1 #当前用户存在于error_users中
i["count"] = i.get("count") + 1 #置当前用户的密码错误次数加1
if i.get("count") >= 3: #如果错误次数等于3
with open('locklist.txt','a') as f_lock: #就锁定这个账户
f_lock.write("\n%s" % username)
print("输入错误次数过多,%s账户已被锁定!请联系管理员!" %(username))
else: #如果错误次数小于3,则打印提示信息
print("用户%s已输入错误密码%d次,此账户还剩%d次尝试机会" % (i.get("name") , i.get("count"),3 - i.get("count")))
break #如果再error_users中找到了当前的用户,则退出error_users的循环
else: #如果在error_users中没找到这个用户,则打印提示信息,并设置flag2=0
flag2 = 0
if flag2 == 0: #添加当前用户到error_users中。
flag1 = 2 #用户名和密码都不正确
print("添加前字典情况",error_users)
error_users.append({'name':username,'count':1})
print("用户%s已输入错误密码1次,此账户还剩2次尝试机会" % (username))
print("添加%s用户到字典"%username)
print(error_users)
flag2 = 1 #设置flag2=1表示error_users为非空 if flag1 == 1: #flag1=1表示用户名密码正确,则退出
break
elif flag1 == 0: #flag=0表示用户名不存在斌,error_count加1
error_count += 1
print("用户名不存在,请重新输入,还剩%d次尝试机会" %(3 - error_count))
elif flag1 == 2: #flag1=2表示用户名正确但是密码错误.error_count 加1
error_count += 1
if error_count >= 3: #如果输错的此时大于等于3则打印提示信息,并sleep5秒,重置error_count
print("输入错误次数超过3次,请5秒后重新输入")
error_count = 0
time.sleep(5)

python作业1.1,编写登录模块的更多相关文章

  1. pyhton学习,day1作业,用户名密码登录模块

    要求,通过用户名密码登录,登录错误3次,锁定用户名 # coding=utf-8 # Author: RyAn Bi import os, sys #调用系统自己的库 accounts_file = ...

  2. day1 作业编写登录窗口

    作业一:编写登录接口 (1)输入用户名和密码: (2)认证成功后显示欢迎信息: (3)输错三次后锁定. 思路:我们知道,要想让程序记住之前输入多少次,锁定用户,那么可以使用数据库来保存用户的状态,然而 ...

  3. (转)python编写登录接口

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://506554897.blog.51cto.com/2823970/1907262 ...

  4. python基础一之课后作业:编写登录接口

    1 # Author : Mamba 2 3 #python基础一之课后作业:编写登录接口 4 5 # 输入用户名密码 6 # 认证成功后显示欢迎信息 7 # 用户名3次输入错误后,退出程序 8 # ...

  5. Flask10 登录模块、表单框架、表单渲染、表单验证、bookie、请求之前钩子、g对象、编写装饰器

    from flask import Flask from flask import request from flask import render_template from flask_wtf i ...

  6. 关于python怎样编写登录接口

    把今天的成果展示下,关于怎么用python编写登录接口, 要求是   1.输入用户名和密码 2.输错三次密码就锁定用户 3.认证成功后输出欢迎信息 账号文件内容如下: sanjiang sanjian ...

  7. Python作业--登录接口

    作业需求: 编写登陆接口 输入用户名密码 认证成功后显示欢迎信息 输错三次后锁定 实现思路: 1.从文件获取用户名密码 2.判断是否在黑名单中 3.验证用户名密码 成功:输出认证成功 错误:判断验证次 ...

  8. python 作业

    Linux day01 计算机硬件知识整理 作业要求:整理博客,内容如下 编程语言的作用及与操作系统和硬件的关系 应用程序->操作系统->硬件 cpu->内存->磁盘 cpu与 ...

  9. Python第十五天 datetime模块 time模块 thread模块 threading模块 Queue队列模块 multiprocessing模块 paramiko模块 fabric模块

    Python第十五天  datetime模块 time模块   thread模块  threading模块  Queue队列模块  multiprocessing模块  paramiko模块  fab ...

随机推荐

  1. MongoDB整理笔记の导入导出

    一.导入 1.导入json数据 我们先将表user删除掉,以便演示效果: > db.user.drop(); true > show collections; system.indexes ...

  2. Map存储容量及内存占用测试

    Integer a = 1; long start = 0; long end = 0; // 先垃圾回收 System.gc(); start = Runtime.getRuntime().free ...

  3. Arduino ADC + 模拟温度传感器LM35D

    LM35是美国国家半导体(后被TI收购)推出的精密温度传感IC系列,其信号输出方式为模拟输出,输出电压值与摄氏温度值呈正比,且用户不需额外的校正就能获得较高的测量精度.其主要特性有: 供电电压:4~3 ...

  4. C语言中无符号与有符号问题

    unsigned char a[5] = { 12,36,96,128,182 }; a[]范围为0~256. 数组中数都有效. char a[5] = { 12,36,96,128,182 }; a ...

  5. 死磕Java之聊聊ThreadLocal源码(基于JDK1.8)

    记得在一次面试中被问到ThreadLocal,答得马马虎虎,所以打算研究一下ThreadLocal的源码 面试官 : 用过ThreadLocal吗? 楼主答 : 用过,当时使用ThreadLocal的 ...

  6. linux虚拟机安装mysql(Mysql-5.7.10)

    注:MySQL5.5版本开始弃用了常规的configure编译方法,通过cmake来编译.需要下载安装cmake编译器.boost库.ncurses库.GNU分析器生成器bison 1. 安装基础环境 ...

  7. Go环境搭建(Windows)

    下载MSI MSI地址 配置环境变量 GOPATH: 用于存放Go语言Package的目录,这个目录不能在Go的安装目录中 GOBIN: Go二进制文件存放目录,写成%GOROOT%\bin就好 PA ...

  8. PHP获取对象的纯数字属性

    php的对象属性 我们知道获取php的对象属性用箭头: echo $obj->name; 如果属性名是一个变量,那么可以用: $var = 'name'; echo $obj->$var; ...

  9. myeclipse2014 安装maven3.3.9和maven配置本地仓库 及错误修改

    结合网上的知识梳理以及自己安装的经验 myeclipse2014 安装maven3.3.9和maven配置本地仓库  及犯的错误修改  成功搞定maven 1,安装 Maven 之前要求先确定你的 J ...

  10. 4.SVM