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:
代码:
#!/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),成功不是将来才有的,而是从决定去做的那一刻起,持续累积而成。