1. 前言

    最近一直在研究学习python,基于python写一个模拟用户登陆验证的程序,大牛勿喷,欢迎各位同仁指导,学习!该程序使用函数式编程方式,将各个功能模块用函数实现,具体函数说明如下:get_username()从键盘中获取用户的输入,check_user_lock()检查用户名是否被锁定,get_password()从键盘获取密码的输入,check_user_password()检查用户名和密码是否正确,lock_user()用户名和密码输错三次则锁定用户,main()执行函数功能调用和功能检测。


2. 程序内容

#!/usr/bin/python
#coding:utf-8
import sys
import getpass

def get_username():
        '''
        从键盘中获取用户的输入,并对输入做检测,允许Ctrl+C,Ctrl+D退出输入,输入不为空,则返回用户名
        '''
        try:
                while True:
                        username = raw_input('\033[32mPlease input username:\033[0m')
                        if username.strip() == '': 
                                continue
                        else:
                                break
        except Exception as e:
                print e
                sys.exit(1)
        except KeyboardInterrupt:
                print ""
                sys.exit(1)
        return username
        
def get_password():
        '''
        从键盘中获取密码的输入,并检测
        '''
        try:
                while True:
                        password = getpass.getpass('\033[32mPlease input password:\033[0m')
                        if password.strip() == '':
                                continue
                        else:
                                break
        except Exception as e:
                print e
                sys.exit(1)
        except KeyboardInterrupt:
                print ""
                sys.exit(1)
        return password
        
def check_user_lock(username):
        '''
        检查用户名是否被锁定,将锁定的用户名存放在userlock.txt文件内,锁定则返回True
        '''
        lock_flag = False
        try:
                f = file('userlock.txt','r')
                if username in [ user.strip() for user in f.readlines() ]:
                        lock_flag = True
                f.close()
        except Exception as e:
                print e
                sys.exit(1)
        return lock_flag 
        
def lock_user(username):
        '''
        执行用户锁定,写入锁定的文件内,输错密码的次数交由其他地方处理,此处只是执行用户锁定的操作
        '''
        try:
                f = file('userlock.txt','a+')
                if username not in [ user.strip() for user in f.readlines() ]:
                        f.write(username)
                        f.write("\n")
                f.close()
        except Exception as e:
                print e
                sys.exit(1)
def check_user_password(username,password):
        '''
        检测用户名和密码是否正确,用户名和密码存放在userinfo.txt内,用户名和密码以:号分割,如果匹配正确,则返回True
        '''
        allow_flag = False
        try:
                f = file('userinfo.txt','r')
                for line in f.readlines():
                        user,passwd = line.strip().split(":")
                        if user == username and password == passwd:
                                allow_flag = True
                f.close()
        except Exception as e:
                print e
                sys.exit(1)
        return allow_flag
        
def main():
        '''
        执行函数功能调用,依次调用get_username(),get_password函数,并调用check_user_password()函数检查用户名和密码是否输入正确,不正确,则有三次输入用户名or密码的机会
        '''
        retry_time = 0
        retry_max_time = 3
        while True:
                username = get_username()
                if check_user_lock(username) is True:
                        sys.exit('\033[31muser %s has been locked now\033[0m') % (username)
                password = get_password()
                if check_user_password(username,password) is not True:
                        retry_time = retry_time + 1
                        if retry_time < retry_max_time:
                                print "用户密码输入错误,请重新输入(还剩%d次):" % (retry_max_time - retry_time)
                        else:
                                print "超过三次,用户已经被锁定!"
                                lock_user(username)
                                sys.exit(-1)
                else:
                        print "\033[33mCongratulation,you have login User System!\033[1m"
                        break
                        
if __name__ == "__main__":
        main()

说明:userinfo.txt文件内,用户密码以:user:password的方式书写,每行一个代表一个用户,userlock.txt则一个用户一行。