Readme:

运行程序流程详解

1、 程序运行开始后,会提示欢迎信息,要求用户输入用户名

2、首先程序会对黑名单里的锁定用户id进行判断,若在黑名单中存在,直接提示用户锁定,并且退出

3、用户名在黑名单中不存在,程序会对白名单里的合法用户id进行判断,若连续输入用户id错误达三次程序会调用注册函数,用户注册成功后直接退出(注册用户时,当用户输入后程序会检查用户输入的ID在白名单中是否存在,存在会提示重新输入,不存在则跳到第4步)

4、用户名输入正确,提示输入密码,程序会对正确用户名后的密码进行判断,输入密码有3次机会,在进入第二次密码输入的时候会提示验证码的输入,验证码输入错误,一直提示,密码连续三次错误则会锁定用户id并且退出.

5、当用户名和密码都正确,程序会提示登录成功,并且会输出登录时间,并把登录的用户名和登录时间输出到一个login_time_log的文件中

PS:

1、white_list是白名单文件,存放的是正常的用户和密码

2、black_list是黑名单文件,存放的是已经锁定的用户(默认为空)

3、login_time_log是用户登录日志文件(默认为空)

 

Flow chart:

python 用户 python用户登录的三次机会_验证码

代码:

 

python 用户 python用户登录的三次机会_赋值_02

python 用户 python用户登录的三次机会_验证码_03

#!/usr/bin/env python
# _*_ coding: utf-8 _*_
# @Time    : 2017/1/8 17:55
# @Author  : zjz10
# @File    : login.py
# @Software: PyCharm
# @EMAIL     18301597972@163.com
# -----------------------------------------------------

# 导入模块
import sys,os,getpass,random
import datetime,hashlib

# 清理屏幕
os.system('cls')                            # Windows中的方法
# os.system('clear')                        # Linux系统中的方法

# 记录成功登录用户的时间
def usertime():
    login_time = str(datetime.datetime.now())   # 使用datetime模块获取当前时间,转换成str赋值给login_time变量
    print('用户 %s 登录时间是:%s' %(name,login_time))  # 打印输出登录的时间
    with open('login_user_time','a+') as time_user: # 以追加的权限打开一个login_user_time的文件(文件存在追加,不存在创建)
        time_user.write('User %s Login time is: %s' %(name,login_time) + '\n')  # 将数据写入到文件中

# 注册用户的函数
def register():
    new_wl_user = open('white_list','r')
    new_wl_list = new_wl_user.readlines()
    new_wl_user.close()
    for new_wl_line in new_wl_list:
        (new_user, new_passwd) = wl_line.strip('\n').split()
    while True:
        new_username = input('请输入注册用户名:')
        if new_username == new_user:
            print('用户名已经存在,请重新输入')
            continue
        else:
            new_password = getpass.getpass('请输入新用户密码:') # 使用getpass模块输入密码是密文输入
            break

    while True:
        new_password_again = getpass.getpass('请再次确认新用户密码:')  # 再次确认密码
        if new_password_again != new_password:  # 密码错误则循环
            continue
        else:
            break  # 正确则跳出循环执行下一个循环

    account_information = "%s %s" % (new_username, new_password)
    with open('white_list', 'a+') as file:  # 把用户信息存入白名单,a+为读写追加模式
        file.write(account_information + '\n')  # 写入并换行
    decoration1 = ''
    print(decoration1.center(50,'-'))
    print(("恭喜你注册成功,用户名密码是>>: %s ") % (account_information))
    print("请重新登录你的账号")
    print(decoration.center(50,'-'))

# 生成验证码函数
def generate_verification_code(len=4):
    code_list = []                          # 定义一个空的列表
    for i in range(10):                     # 使用for循环循环0-9的数字并赋值个i(这里的10表示0--9的数字)
        code_list.append(str(i))            # 将0--9以字符串的方式使用.append方法添加到上面定义的空列表
    for i in range(65,91):                  # 使用for循环循环0-9的数字并赋值个i(这里的65,91是表示ASCII码中的A--Z)
        code_list.append(chr(i))            # 将A--Z以字符串的方式使用.append方法添加到上面定义的空列表
    for i in range(97,123):                 # 使用for循环循环0-9的数字并赋值个i(这里的97,123是表示ASCII码中的a--z)
        code_list.append(chr(i))            # 将a--z以字符串的方式使用.append方法添加到上面定义的空列表
    slice = random.sample(code_list, len)   # 从列表中随机获取4个元素,作为一个片断返回
    verification_code = ''.join(slice)      # 列表转换成字符串的形式存放到verification_code变量中
    return verification_code                # 输出verification_code

# 输入验证码函数
def verification_code():
    while True:
        code = generate_verification_code(4)    # 将最后得到的4为组合的验证码赋值给code
        print('验证码是>>:' + code)
        print('-------------------------------------')
        verification = input('请输入验证码>>:')
        print('-------------------------------------')
        if verification == code:                # 如果输入的验证码正确,正常跳出循环,执行下一个循环
            break                               # 正确则跳出整个循环执行下一个循环
        else:                                   # 如果输入错误,提示用户
            print('验证码输入错误,请重新输入')
            continue                            # 终止当前循环,并且跳出当前循环,进入下一个循环

# 程序开始
login = 0                                       # 用户的循环次数
while login < 3:                                # 只要用户登录异常不超过3次就不断循环
    decoration = ''
    print(decoration.center(50,'-'))
    print('欢迎访问身份验证系统,请输入您的信息')
    print(decoration.center(50,'-'))
    name = input('请输入您的用户名>>:')          # 使用input实现用户输入,并且赋值给name变量

    bl_user = open('black_list','r+')           # 打开黑名单文件,权限是读取更新
    bl_list = bl_user.readlines()    # 使用.readlines()方法逐行读取

    for bl_line in bl_list:
        bl_line = bl_line.strip('\n')           # 使用.strip()的方法去掉换行符
        if name == bl_line:                     # 判读用户输入的用户名是否在黑名单存在(存在提示锁定,并退出)
            print('您的用户 %s 已经锁定,请联系您的管理员' %(name))
            sys.exit()
    with open('white_list','r') as wl_user:     # 打开白名单文件,权限是只读,赋值给wl_user
        wl_list = wl_user.readlines()           # 使用.readlines()方法逐行读取

    for wl_line in wl_list:
        (user,passwd) = wl_line.strip('\n').split()     # 分别获取用户名和密码信息
        if user == name:                        # 判断用户输入的用户是否在白名单中存在
            pwd = 0                             # 输入密码的循环次数
            while pwd < 3:                      # 只要用户输入密码错误不超过3次就不断循环
                password = getpass.getpass('请输入您的密码>>:') # 使用getpass模块的.getpass方法让用户输入密码(密文输入)
                if password == passwd:          # 判断输入的密码是否在白名单中存在
                    print('您已经通过验证,欢迎 %s 登录身份验证系统'%(name))  # 用户名和密码全部相等,提示登录成功
                    usertime()
                    sys.exit()                  # 退出
                else:
                    if pwd != 2:                # pwd=2时,是最后一次机会,不用在提示还剩余0次机会了
                        print('对不起,%s 的密码错误,请重新输入,你还有 %d 次机会' % (name, 2 - pwd))
                        print('-------------------------------------')
                        print('请输入验证码进行验证')
                        # print('验证错误')
                        verification_code()     # 调用验证码函数
                pwd += 1                        # 密码输入错误后,循环值增加1
            else:
                bl_user.write(name + '\n')      # 密码3次输入错误,写入到黑名单
                bl_user.close()                 # 关闭文件
                sys.exit('非常抱歉,您输入的密码次数已经超过上限,用户 %s 已经锁定,请联系管理员'%(name))
        else:
            pass
    else:
        if login != 2:                          # login=2时,是最后一次机会,不用在进行提示还剩余多少机会
            print('对不起,%s 输入错误,请重新输入,你还有 %d 次机会' %(name,2 - login))
    login += 1                                  # 用户输入错误后,循环值增加1
else:
    pass
# 用户输入用户名3次错误后执行下面代码
new_name = input('您输入的用户 %s 不存在,是否需要注册y or n >>:' %(name)) # 提示用户是否注册
while True:
    if new_name == 'y':                                                  # 用户输入y
        register()                                                       # 调用注册函数
        break                                                            # 正确则跳出整个循环执行下一个循环
    else:                                                                # 用户输入n
        sys.exit()                                                       # 退出程序

View Code

  注:代码还有待优化,仅供参考

朱敬志(brian),成功不是将来才有的,而是从决定去做的那一刻起,持续累积而成。