day04-decorator

# Author: 刘佳赐-Isabelle
# Email: jiaci.liu@gmail.com
'''
练习题:
1、整理装饰器的形成过程,背诵装饰器的固定格式
2、编写装饰器,在每次执行被装饰函数之前打印一句’每次执行被装饰函数之前都得先经过这里,这里根据需求添加代码’
3、编写装饰器,在每次执行被装饰函数之后打印一句’每次执行完被装饰函数之后都得先经过这里,这里根据需求添加代码’
4、编写装饰器,在每次执行被装饰函数之前让用户输入用户名,密码,给用户三次机会,登录成功之后,才能访问该函数.
5、编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件,只支持单用户的账号密码,给用户三次机会),要求登录成功一次,后续的函数都无需再输入用户名和密码
6、编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件,可支持多账号密码),要求登录成功一次(给三次机会),后续的函数都无需再输入用户名和密码。
7、给每个函数写一个记录日志的功能,

'''
'''
1、整理装饰器的形成过程,背诵装饰器的固定格式
'''
# def wrapper(f):
#     def inner(*args, **kwargs):
#         ret = f(*args, **kwargs)
#         return ret
#     return inner

'''
2、编写装饰器,在每次执行被装饰函数之前打印一句’每次执行被装饰函数之前都得先经过这里,这里根据需求添加代码’
'''
# def wrapper2(f):
#     def inner2(*args, **kwargs):
#         print('每次执行被装饰函数之前都得先经过这里,这里根据需求添加代码')
#         ret = f(*args, **kwargs)
#         return ret
#     return inner2

'''
3、编写装饰器,在每次执行被装饰函数之后打印一句’每次执行完被装饰函数之后都得先经过这里,这里根据需求添加代码’
'''
# def wrapper3(f):
#     def inner(*args, **kwargs):
#         ret = f(*args, **kwargs)
#         print('每次执行完被装饰函数之后都得先经过这里,这里根据需求添加代码')
#         return ret
#     return inner

'''
4、编写装饰器,在每次执行被装饰函数之前让用户输入用户名,密码,给用户三次机会,登录成功之后,才能访问该函数.
'''
# # Method 1
# def wrapper41(f):
#     def inner(*args, **kwargs):
#         '''
#         Function to check user name and password
#         :param args:
#         :param kwargs:
#         :return:
#         '''
#         userinfo = []
#         username_list = []
#         with open('jd_userinfo', encoding='utf-8') as file:
#             for line in file:
#                 username_list.append(line.strip().split('|')[0])
#                 userinfo.append(line.strip().split('|'))
#
#         username = input('Please input your username:').strip()
#
#         if username in username_list:
#             password = input('Please input your password:').strip()
#             for times in range(0, 3):
#                 if [username, password] in userinfo and times < 2:
#                     ret = f(*args, **kwargs)
#                     return ret
#                 elif [username, password] not in userinfo and times < 2:
#                     times += 1
#                     print('Invalid Password, left %d times!' % (3-times))
#                     password =input('Please input your password again:').strip()
#                 elif [username, password] not in userinfo and times >= 2:
#                     print('Invalid Password, tried 3 times, your account has been locked!!')
#         elif username not in username_list:
#             print('Invalid username!')
#     return inner
#
# # Method 2
# def wrapper42(f):
#     def inner(*args, **kwargs):
#         times = 0  # tried times
#         userinfo = []
#         username_list = []
#         with open('jd_userinfo', encoding='utf-8') as file:
#             for line in file:
#                 username_list.append(line.strip().split('|')[0])
#                 userinfo.append(line.strip().split('|'))
#
#         username = input('Please input your username:').strip()
#
#         if username in username_list:
#             password = input('Please input your password:').strip()
#             while 1:
#                 if [username, password] in userinfo and times < 2:
#                     ret = f(*args, **kwargs)
#                     return ret
#                 elif [username, password] not in userinfo and times < 2:
#                     times += 1
#                     print('Invalid Password, left %d times!' % (3-times))
#                     password =input('Please input your password again:').strip()
#                 elif [username, password] not in userinfo and times >= 2:
#                     print('Invalid Password, tried 3 times, your account has been locked!!')
#                     break
#
#         elif username not in username_list:
#             print('Invalid username!')
#     return inner
#
# @wrapper41
# # @wrapper42
# def f():
#     print(111)
#
# f()

'''
5、编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件,只支持单用户的账号密码,给用户三次机会),
要求登录成功一次,后续的函数都无需再输入用户名和密码
'''

# login_status = {
#     'username': None,
#     'status': False,
# }
#
# def wrapper(f):
#     def inner(*args, **kwargs):
#         '''
#         Function to check login status, if not logged in, check user name and password to login;
#         once logged in, no need to verify status for further functions!
#         :param args:
#         :param kwargs:
#         :return:
#         '''
#         if login_status['status']:
#             ret = f(*args, **kwargs)
#             return ret
#         else:
#             userinfo = []
#             username_list = []
#             with open('jd_userinfo', encoding='utf-8') as file:
#                 for line in file:
#                     username_list.append(line.strip().split('|')[0])
#                     userinfo.append(line.strip().split('|'))
#
#             username = input('Please input your username:').strip()
#
#             if username in username_list:
#                 password = input('Please input your password:').strip()
#                 for times in range(0, 3):
#                     if [username, password] in userinfo and times < 2:
#                         ret = f(*args, **kwargs)
#                         login_status['status'] = True
#                         login_status['username'] = username
#                         return ret
#                     elif [username, password] not in userinfo and times < 2:
#                         times += 1
#                         print('Invalid Password, left %d times!' % (3-times))
#                         password =input('Please input your password again:').strip()
#                     elif [username, password] not in userinfo and times >= 2:
#                         print('Invalid Password, tried 3 times, your account has been locked!!')
#             elif username not in username_list:
#                 print('Invalid username!')
#     return inner
#
# @wrapper
# def func1():
#     print(111)
#
# @wrapper
# def func2():
#     print(222)
#
# @wrapper
# def func3():
#     print(333)
#
# func1()
# func2()
# func3()

'''
6、编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件,可支持多账号密码),
要求登录成功一次(给三次机会),后续的函数都无需再输入用户名和密码。
'''

# login_status = {
#     'TM_username': None,
#     'TM_status': False,
#     'JD_username': None,
#     'JD_status': False,
# }
#
#
# def account(Flag):
#     def wrapper(f):
#         def inner(*args, **kwargs):
#             '''
#             Function to check login status, if not logged in (available to check multiple accounts),
#             check user name and password to login;
#             once logged in, no need to verify status for further functions!
#             :param args:
#             :param kwargs:
#             :return:
#             '''
#             account_book = Flag.lower()+'_userinfo'
#             account_username = Flag+'_username'
#             account_status = Flag+'_status'
#
#             if login_status[account_status]:
#                 ret = f(*args, **kwargs)
#                 return ret
#             else:
#                 userinfo = []
#                 username_list = []
#
#                 with open(account_book, encoding='utf-8') as file:
#                     for line in file:
#                         username_list.append(line.strip().split('|')[0])
#                         userinfo.append(line.strip().split('|'))
#
#                 username = input('Please input your %s account username:' % Flag).strip()
#
#                 if username in username_list:
#                     password = input('Please input your %s account password:' % Flag).strip()
#                     for times in range(0, 3):
#                         if [username, password] in userinfo and times < 2:
#                             login_status[account_status] = True
#                             login_status[account_username] = username
#                             ret = f(*args, **kwargs)
#                             return ret
#                         elif [username, password] not in userinfo and times < 2:
#                             times += 1
#                             print('Invalid Password, left %d times!' % (3-times))
#                             password =input('Please input your password again:').strip()
#                         elif [username, password] not in userinfo and times >= 2:
#                             print('Invalid Password, tried 3 times, your account has been locked!!')
#                 elif username not in username_list:
#                     print('Invalid username!')
#         return inner
#     return wrapper
#
# @account('TM')
# def func1():
#     print(111)
#
# @account('JD')
# def func2():
#     print(222)
#     print(login_status['JD'+'_username'])
#
# @account('TM')
# def func3():
#     print(333)
#
# func1()
# func2()
# func3()

'''
7、给每个函数写一个记录日志的功能,
'''
# import time
# struct_time = time.localtime()
# 
# def wrapper(f):
#     def inner(*args, **kwargs):
#         ret = f(*args, **kwargs)
#         with open('diary', mode='a', encoding='utf-8') as file:
#             file.write('Function {} was conducted at {}'.format(str(f)[10:str(f).index('at')-1], 
#                                                                 time.strftime("%Y-%m-%d %H:%M:%S", struct_time)))
#         return ret
#     return inner
# 
# @wrapper
# def func():
#     print(1)
# 
# func()

"""
功能要求:每一次调用函数之前,要将函数名称,时间节点记录到log的日志中。
所需模块:
    import time
    struct_time = time.localtime()
    print(time.strftime("%Y-%m-%d %H:%M:%S",struct_time))
1),启动程序,首页面应该显示成如下格式:
    欢迎来到博客园首页
    1:请登录
    2:请注册
    3:文章页面
    4:日记页面
    5:评论页面
    6:收藏页面
    7:注销
    8:退出程序
2),用户输入选项,3~6选项必须在用户登录成功之后,才能访问成功。
3),用户选择登录,用户名密码从register文件中读取验证,三次机会,
        没成功则结束整个程序运行,成功之后,可以选择访问3~6项,访问页面之前,
        必须要在log文件中打印日志,日志格式为-->用户:xx 在xx年xx月xx日 执行了 %s函数,
        访问页面时,页面内容为:欢迎xx用户访问评论(文章,日记,收藏)页面
4),如果用户没有注册,则可以选择注册,注册成功之后,可以自动完成登录,然后进入首页选择。
5),注销用户是指注销用户的登录状态,使其在访问任何页面时,必须重新登录。

"""
# import time
# struct_time = time.localtime()
#
#
# login_status = {
#     'TM_username': None,
#     'TM_status': False,
#     'JD_username': None,
#     'JD_status': False,
# }
#
# default_page = '''
# 欢迎来到博客园首页
#     1:请登录
#     2:请注册
#     3:文章页面
#     4:日记页面
#     5:评论页面
#     6:收藏页面
#     7:注销
#     8:退出程序
# '''
# def account(Flag='TM'):
#     def login_check(func):
#         '''
#         Decoration function
#         :param func: function to be decorated
#         :return: func
#         '''
#         def inner(*args, **kwargs):
#             '''
#             decoration function
#             :param args:
#             :param kwargs:
#             :return: decorated function
#             '''
#             account_book = Flag.lower()+'_userinfo'
#             account_username = Flag+'_username'
#             account_status = Flag+'_status'
#             account_diary = Flag+'_diary'
#
#             if login_status[account_status]:
#                 ret = func(*args, **kwargs)
#
#                 with open(account_diary, mode='a', encoding='utf-8') as file:
#                     file.write('用户:{}在{}执行了{}\n'.format(login_status[account_username],
#                                                             time.strftime("%Y-%m-%d %H:%M:%S", struct_time),
#                                                             str(func)[10:str(func).index('at') - 1]))
#                 return ret
#             else:
#                 print("Please login first!")
#
#                 # check user name and password
#                 username = input("Please input your username:").strip()
#
#                 # make a list of saved username and corresponding password
#                 # TODO: is this necessary to create a new list?
#                 username_list = []  # list of user name
#                 userinfo_list = []  # list of user name and corresponding password
#                 with open(account_book, encoding="utf-8") as file:
#                     for line in file:
#                         username_list.append(line.strip().split("|")[0])  # TODO:any simpler expression?
#                         userinfo_list.append(line.strip().split("|"))     # TODO:any simpler expression?
#                 if username in username_list:
#                     password = input('Please input your password:').strip()
#                     for times in range(0, 3):
#                         if [username, password] in userinfo_list:
#                             login_status[account_username] = username
#                             login_status[account_status] = True
#                             ret = func(*args, **kwargs)
#
#                             with open(account_diary, mode='a', encoding='utf-8') as file:
#                                 file.write('用户:{}在{}执行了{}\n'.format(login_status[account_username],
#                                                                     time.strftime("%Y-%m-%d %H:%M:%S", struct_time),
#                                                                     str(func)[10:str(func).index('at') - 1]))
#                             return ret
#                         elif [username, password] not in userinfo_list and times < 2:
#                             times += 1
#                             print('Invalid password, left %d times!' % (3 - times))
#                             password = input('Please input your password again:')
#                         elif [username, password] not in userinfo_list and times >= 2:
#                             print('Invalid password, failed for three times!! You account has been locked!')
#                 elif username not in username_list:
#                     print("Unregistered username, please register!")
#                     register()
#         return inner
#     return login_check
#
#
# @account('JD')
# def register():
#     global operation
#
#     # check whether the username is available (occupied or not)
#     username_check = []  # TODO: is this necessary to create a new list?
#
#     with open("jd_userinfo", "r+", encoding="utf-8") as file:
#         for line in file:
#             username_check.append(line.strip().split()[0])
#         username = input("Please set your username:").strip()
#         while 1:
#             if username not in username_check:
#                 password = input("Please set your password:")
#                 file.write("{}|{}\n".format(username, password))
#
#                 login_status['JD'+'_status'] = True
#                 login_status['JD'+'_username'] = username
#                 print(default_page)
#
#                 with open('JD' + '_diary', mode='a', encoding='utf-8') as file2:
#                     file2.write('用户:{}在{}执行了{}\n'.format(login_status['JD' + '_username'],
#                                                        time.strftime("%Y-%m-%d %H:%M:%S", struct_time),
#                                                        str(register)[10:str(register).index('at') - 1]))
#                 operation = input('Please select your operation(1-8):')
#                 dic[int(operation)]()
#
#             elif username in username_check:
#                 print("Username has been taken, please reset your username!!")
#                 username = input("Please set your username again:").strip()
#
# @account('JD')
# def login():
#     print(default_page)
#     operation = int(input('Please select your operation(1-8):'))
#     if operation == 1:
#         print('You have already logged in!!')
#         operation = int(input('Please select your operation(2-8):'))
#     else:
#         dic[operation]()
#
#
# @account('JD')
# def page():
#     print("欢迎用户%s访问文章页面" % login_status['JD'+'_username'])
#     operation = int(input('Please select your operation(1-8):'))
#     dic[operation]()
#
# @account('JD')
# def diary():
#     print("欢迎用户%s访问日志页面" % login_status['JD'+'_username'])
#     with open('JD'+'_diary', encoding='utf-8') as file:
#         for line in file:
#             print(line.strip('\n'))
#     operation = int(input('Please select your operation(1-8):'))
#     dic[operation]()
#
# @account('JD')
# def comment():
#     print("欢迎用户%s访问评论页面" % login_status['JD'+'_username'])
#     operation = int(input('Please select your operation(1-8):'))
#     dic[operation]()
#
# @account('JD')
# def save():
#     print("欢迎用户%s访问收藏页面" % login_status['JD'+'_username'])
#     operation = int(input('Please select your operation(1-8):'))
#     dic[operation]()
#
# @account('JD')
# def logout():
#     print("账号已退出!")
#
# @account('JD')
# def quit_operation():
#     pass
#
# dic = {
#     1: login,
#     2: register,
#     3: page,
#     4: diary,
#     5: comment,
#     6: save,
#     7: logout,
#     8: quit_operation,
# }
#
#
# if __name__ == '__main__':
#     print(default_page)
#     operation = int(input('Please select your operation(1-8):'))
#     dic[operation]()

 

posted @ 2018-11-10 09:56  Isabelle-古灵精  阅读(146)  评论(0编辑  收藏  举报