python之登陆验证(装饰器的应用)

# -*- coding:utf-8 -*-


def login():
    # print(‘请完成登陆功能‘)
    count = 1
    while count < 4:
        username = input(‘输入登陆用户名>>:‘).strip()
        password = input(‘输入登陆密码>>:‘).strip()
        with open(‘register‘, encoding=‘utf-8‘, mode=‘r‘) as f:
            for line in f:
                if line.split(‘&‘)[0].replace(‘[‘, ‘‘) == username and line.split(‘&‘)[1].replace(‘]\n‘,
                                                                                                  ‘‘) == password:
                    print(‘验证成功,正在登陆...‘)
                    # 登陆成功返回的状态码
                    return 100
            else:
                print(f‘用户名或密码错误,请重新输入,剩余{3 - count}次机会‘)

        count += 1


status_dict = {
    ‘username‘: None,
    ‘status‘: False,
}


def register():
    # print(‘请完成注册功能‘)
    username = input(‘输入注册的用户名>>:‘).strip()
    password = input(‘输入注册的密码>>:‘).strip()
    with open(‘register‘, encoding=‘utf-8‘, mode=‘a‘) as f:
        f.write(f‘[{username}&{password}]\n‘)


def auth(func):
    ‘‘‘
    装饰器完成的功能是,访问被装饰函数之前,写一个三次验证登陆的功能
    登陆成功,让其访问被装饰函数的内容,登陆不成功不让访问
    :param func:
    :return:
    ‘‘‘

    def wrapper(*args, **kwargs):
        # 如果用户显示的是登陆状态,后续页面直接登陆,无需验证
        if status_dict[‘status‘]:
            res = func(*args, **kwargs)
            return res
        # 如果用户处于未登陆状态,提示登陆,获取登陆状态码,如果是100,修改用户登陆状态
        else:
            status_code = login()
            if status_code == 100:
                status_dict[‘status‘] = True
                res = func(*args, **kwargs)
                return res

    return wrapper


@auth
def article():
    print(‘欢迎访问文章页面‘)


@auth
def comment():
    print(‘欢迎访问评论页面‘)


@auth
def dariy():
    print(‘欢迎访问日志页面‘)


def main():
    article()
    comment()
    dariy()


if __name__ == ‘__main__‘:
    main()