女神博客链接:https://www.cnblogs.com/Eva-J/articles/11254517.html
练习
1、整理装饰器的形成过程,背诵装饰器的固定格式
2、编写装饰器,在每次执行被装饰函数之前打印一句’每次执行被装饰函数之前都得先经过这里,这里根据需求添加代码’
3、编写装饰器,在每次执行被装饰函数之后打印一句’每次执行完被装饰函数之后都得先经过这里,这里根据需求添加代码’
4、编写装饰器,在每次执行被装饰函数之前让用户输入用户名,密码,给用户三次机会,登录成功之后,才能访问该函数.
5、编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件,只支持单用户的账号密码,给用户三次机会),要求登录成功一次,后续的函数都无需再输入用户名和密码
6、编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件,可支持多账号密码),要求登录成功一次(给三次机会),后续的函数都无需再输入用户名和密码。
7、给每个函数写一个记录日志的功能,
功能要求:每一次调用函数之前,要将函数名称,时间节点记录到log的日志中。
所需模块:
import time
struct_time = time.localtime()
print(time.strftime("%Y-%m-%d %H:%M:%S",struct_time))
8、lambda是什么?试着把简单的需求写成lambda函数。
# -*- coding:utf-8 -*- # caiqinxiong # 2019/7/28 上午10:43 # # 监听 # def listen(): # with open(r'operate.log',mode='r',encoding='utf-8') as f: # while True: # conten = f.readline().strip() # if 'error' in conten: # yield conten # # for conten in listen(): # print(conten) # # # 操作监听的文件 # def wite_file(): # f = open(r'operate.log',mode='a',encoding='utf-8') # inp = input() # f.write(inp) # f.close() # # wite_file() # # 利用生成器来提高读取效率 # def get_user(): # with open(r'userinfo', mode='r',encoding='utf-8') as f: # for line in f: # user,pwd = line.strip().split('|') # yield user,pwd # lst = [i for i in range(1,31) if i % 3 == 0] # print(lst) # # lst = [i**2 for i in range(1,31) if i % 3 == 0] # # print(lst) # # def add(n,i): # return n+i # # def test(): # for i in range(4): # yield i # # g=test() # for n in [1,10]: # g=(add(n,i) for i in g) # # # print(list(g)) # def demo(): # for i in range(4): # yield i # g = demo() # # g1=(i for i in g) # print(list(g1)) # print(list(g)) # # g2=(i for i in g1) # # # print(list(g1)) # # print(list(g2)) # # fun1 = lambda a,b: a if a> b else b # ret = fun1(1,3) # print(ret) # # # func2 = lambda a:'偶数' if a % 2 == 0 else '奇数' # # print(func2(2)) ''' 1、整理装饰器的形成过程,背诵装饰器的固定格式 ''' # 装饰器的固定格式 # def 装饰器的名字(func): # def inner(*args,**kwargs): # '''在执行被装饰的函数之前要做的事儿''' # '''判断是否登录''' # ret = func(*args,**kwargs) # '''在执行被装饰的函数之后要做的事儿''' # '''写log''' # return ret # return inner # # @装饰器的名字 # def wahaha(): # pass # # wahaha() ''' 2、编写装饰器,在每次执行被装饰函数之前打印一句’每次执行被装饰函数之前都得先经过这里,这里根据需求添加代码’ ''' # def warrper(func): # def inner(*args,**kwargs): # print('每次执行被装饰函数之前都得先经过这里,这里根据需求添加代码') # ret = func(*args,**kwargs) # return ret # return inner # # @warrper # def func(): # print('in the func') # func() ''' 3、编写装饰器,在每次执行被装饰函数之后打印一句’每次执行完被装饰函数之后都得先经过这里,这里根据需求添加代码’ ''' # def warrper(func): # def inner(*args,**kwargs): # ret = func(*args,**kwargs) # print('每次执行完被装饰函数之后都得先经过这里,这里根据需求添加代码') # return ret # return inner # # @warrper # def func(): # print('in the func') # func() ''' 4、编写装饰器,在每次执行被装饰函数之前让用户输入用户名,密码,给用户三次机会,登录成功之后,才能访问该函数. ''' # # 用户信息 # user_info = {'caiqinxiong': 'cai', 'lixiaoxin': '123'} # def loggin(user_info): # '''登录''' # def warrper(func): # def inner(*args,**kwargs): # i = 3 # while i > 0: # i -= 1 # username = input('请输入用户名:') # if username in user_info: # j = 3 # while j > 0: # j -= 1 # password = input('请输入密码:') # if password == user_info[username]: # ret = func(*args,**kwargs) # return ret # else: # print('密码输入有误!') # if j == 0: # print('您的尝试机会已用完,账号已锁定,请10分钟后重新尝试!') # exit(-1) # else: # print('你还有%s次尝试机会!' % j) # # # else: # print('用户名不存在!') # if i != 0: # print('你还有%s次尝试机会!' % i) # else: # print('您的尝试机会已用完!') # exit(-1) # return inner # return warrper # # @loggin(user_info) # def func(): # print('wlcome to oldBoy!') # # func() ''' 5、编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件,只支持单用户的账号密码,给用户三次机会),要求登录成功一次,后续的函数都无需再输入用户名和密码 ''' # FLAG = False # def get_user(file): # with open(file,mode = 'r',encoding='utf-8') as f: # for line in f: # usr,pwd = line.strip().split('|') # yield usr,pwd # # def login(func): # def inner(*args,**kwargs): # global FLAG # 将FLAG变量设置成全局变量 # if FLAG: # ret = func(*args, **kwargs) # return ret # else: # for i in range(3): # user = input('username :') # passwd = input('password :') # for usr,pwd in get_user('userinfo'): # if usr == user and pwd == passwd: # print('登录成功') # FLAG = True # ret = func(*args,**kwargs) # return ret # else: # print('账号或密码错误!') # else: # print('登录失败') # return inner # # @login # def func1(): # print('in the func1') # # @login # def func2(): # print('in the func2') # func1() # func2() ''' 6、编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件,可支持多账号密码),要求登录成功一次(给三次机会),后续的函数都无需再输入用户名和密码。 ''' ''' 7、给每个函数写一个记录日志的功能, 功能要求:每一次调用函数之前,要将函数名称,时间节点记录到log的日志中。 所需模块: import time struct_time = time.localtime() print(time.strftime("%Y-%m-%d %H:%M:%S",struct_time)) ''' # from functools import wraps # import time # def log(func): # @wraps(func) # def inner(*args, **kwargs): # ret = func(*args, **kwargs) # DATE = time.strftime('%Y-%m-%d %H:%M:%S') # with open(r'access.log', mode='a', encoding='utf-8') as f: # log_conten = '用户[%s]在%s执行了%s函数\n' % (args[0], DATE, func.__name__) # # print(log_conten) # f.write(log_conten) # return ret # # return inner # # @log # def func1(): # print('in the func1') # # @log # def func2(): # print('in the func2') # # func1() # func2() ''' 8、lambda是什么?试着把简单的需求写成lambda函数。 ''' # lambda 是匿名函数 # lambda表达式 a,b两个值,求比较大的值 # lambda表达式 a为参数,求a的奇\偶性 # lambda表达式 a为参数,求a的绝对值 # func1 = lambda a,b : a if a>b else b # ret = func1(10,2) # print(ret) # # func2 = lambda a : '偶数' if a%2 == 0 else '奇数' # ret = func2(5) # print(ret) # # func3 = lambda a:a if a>0 else -a # ret = func3(-5) # print(ret) # ret = func3(10) # print(ret) # # func = lambda :2+3+4+5 # ret = func() # print(ret) def func(): def func1(): print('in the func1') return func1 f = func() f() def wahaha(): pass def login(func): def inner(*args,**kwargs): print('start') ret = func(*args,**kwargs) print('end') return ret return inner f = login(wahaha) f()
作业
模拟博客园登录:
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),注销用户是指注销用户的登录状态,使其在访问任何页面时,必须重新登录。
6),退出程序为结束整个程序运行。
# -*- coding:utf-8 -*- # caiqinxiong # 2019/7/28 下午8:34 from functools import wraps import time import json import os import sys BASE_DIR = os.path.dirname(os.path.dirname(__file__)) sys.path.append(BASE_DIR) def getUser(): '''获取账户信息''' try: with open(r'register.txt', mode="r", encoding="utf-8") as f: users = json.load(f) # print(users) except: print('have no users inof!') users = {} return users def setUser(users): '''写入用户信息''' with open(r'register.txt', mode='w') as f: json.dump(users, f, indent="\t") # print(users) def checkUser(users, username): '''检查用户是否存在''' if username in users: return True return False def checkPassword(users, username, password): '''校验密码是否正确''' if password == users[username]: return True else: return False def login(users, login_status): '''登录''' if login_status: return login_status i = 3 while i > 0: i -= 1 username = input('请输入用户名:') if checkUser(users, username): j = 3 while j > 0: j -= 1 password = input('请输入密码:') if checkPassword(users, username, password): print('登录成功!') printPage(username) else: print('密码输入有误!') if j == 0: print('登录失败,谢谢使用!') exit(-1) else: print('你还有%s次尝试机会!' % j) else: print('用户名不存在!') if i != 0: print('你还有%s次尝试机会!' % i) else: print('您的尝试机会已用完,是否注册新用户?Y/N') while True: choise = input().strip().upper() if 'Y' == choise: register(users) break elif 'N' == choise: print('谢谢使用!') exit(-1) else: print('输入有误!') def register(users): '''注册 ''' i = 3 while i > 0: i -= 1 username = input('请输入注册的用户名:') if checkUser(users, username): print('用户名已存在!') if i != 0: print('请重新输入,你还有%s次尝试机会!' % i) else: print('您的尝试次数已用完!') else: j = 3 while j > 0: j -= 1 password1 = input('请输入密码:') password2 = input('请再次输入密码:') if password1 == password2: print('账户\033[42;1m%s\033[0m注册成功!' % username) users[username] = password1 setUser(users) users = getUser() return menu(users, username, login_status=True) else: print('两次输入密码不一致!') if j == 0: print('操作过于频繁,请5分钟后再次尝试!') time.sleep(300) else: print('你还有%s次尝试机会!' % j) def log(func): @wraps(func) def inner(*args, **kwargs): ret = func(*args, **kwargs) # DATE = time.strftime('%Y-%m-%d %H:%M:%S') cc = time.localtime(time.time()) DATE = str(cc.tm_year) + '年' + str(cc.tm_mon) + '月' + str(cc.tm_mday) + '日' with open(r'access.log', mode='a', encoding='utf-8') as f: log_conten = '用户[%s]在%s执行了%s函数\n' % (args[0], DATE, func.__name__) # print(log_conten) f.write(log_conten) return ret return inner @log def articlePage(username, login_status): '''文章页面''' print('欢迎%s用户访问\033[31;1m文章\033[0m页面!' % username) return @log def diaryPage(username, login_status): '''日记页面''' print('欢迎%s用户访问\033[31;1m日记\033[0m页面!' % username) return @log def commentPage(username, login_status): '''评论页面''' print('欢迎%s用户访问\033[31;1m评论\033[0m页面!' % username) return @log def collectionPage(username, login_status): '''收藏页面''' print('欢迎%s用户访问\033[31;1m收藏\033[0m页面!' % username) return def turnBack(username, login_status): '''返回上级菜单''' print(''.center(15, '*')) print("1、返回上级") print("2、退出") print(''.center(15, '*')) while True: choise = input("请选择:") if choise == '1': menu(users, username, login_status) break elif choise == '2': print("谢谢使用!") exit(-1) else: print("输入有误,请重新输入!") def printPage(username): '''打印访问页面''' print('#' * 20) print('3、文章页面') print('4、日记页面') print('5、评论页面') print('6、收藏页面') print('#' * 20) while True: choise = input('请选择:').strip() if '3' == choise or '4' == choise or '5' == choise or '6' == choise: return accessPage(username, choise, login_status=True) else: print('输入有误!') def accessPage(username, choise, login_status): '''访问页面逻辑控制''' if '3' == choise: articlePage(username, login_status) elif '4' == choise: diaryPage(username, login_status) elif '5' == choise: commentPage(username, login_status) elif '6' == choise: collectionPage(username, login_status) else: print('输入有误!,请重新输入!') return turnBack(username, login_status) def menu(users, username='', login_status=False): '''主菜单''' print('#' * 20) print('''欢迎来到博客园首页 1、登录博客园 2、注册新用户 3、文章页面 4、日记页面 5、评论页面 6、收藏页面 7、注销 8、退出程序''') print('#' * 20) while True: choise = input('请选择:').strip() if '1' == choise: if login_status: print('用户已登录,请重新选择!') else: login(users, login_status) elif '2' == choise: register(users) elif '3' == choise or '4' == choise or '5' == choise or '6' == choise: if login_status: accessPage(username, choise, login_status) else: print('请登录后访问!') login(users, login_status) elif '7' == choise: print(''.center(15, '*')) print('注销成功,已退出登录!') login_status = False turnBack(username, login_status) elif '8' == choise: print('谢谢使用!') exit(-1) else: print('输入有误,请重新输入!') if __name__ == '__main__': users = getUser() menu(users)
# -*- coding:utf-8 -*- # caiqinxiong # 2019/7/29 下午11:01 from functools import wraps import time import os import sys BASE_DIR = os.path.dirname(os.path.dirname(__file__)) sys.path.append(BASE_DIR) dict_info = {'login_status': False, 'username': None} def get_user(file): '''获取用户信息''' with open(file, mode='r', encoding='utf-8') as f: for line in f: usr, pwd = line.strip().split('|') yield usr, pwd def login(func): '''登录验证''' @wraps(func) def inner(*args, **kwargs): if dict_info['login_status'] == True: print('已是登录状态!') ret = func(*args, **kwargs) return ret else: for i in range(3): user = input('请输入登录名 :') passwd = input('请输入密码 :') for usr, pwd in get_user('userinfo'): if usr == user and pwd == passwd: print('#' * 20) print('登录成功') dict_info['login_status'] = True dict_info['username'] = user ret = func(*args, **kwargs) return ret else: print('账号或密码错误!') else: print('您的3次尝试机会已用完,谢谢使用!') exit(-1) return inner def log(func): '''日志''' @wraps(func) def inner(*args, **kwargs): ret = func(*args, **kwargs) DATE = time.strftime('%Y-%m-%d %H:%M:%S') with open(r'access.log', mode='a', encoding='utf-8') as f: log_conten = '用户[%s]在%s执行了%s函数\n' % (args[0], DATE, func.__name__) # print(log_conten) f.write(log_conten) return ret return inner @login def loginBlog(): '''登录博客''' return printMenu() def register(): '''注册''' for i in range(3): user = input('请输入注册名 :') for usr, pwd in get_user('userinfo'): if usr == user: print('用户名已存在!') break else: passwd = input('请输入密码 :') print('账户\033[42;1m%s\033[0m注册成功!' % user) dict_info['login_status'] = True dict_info['username'] = user with open('userinfo', mode='a', encoding='utf-8') as f: f.write(user + '|' + passwd + '\n') printMenu() break else: print('操作过于频繁,请5分钟后再试!') time.sleep(300) @login @log def articlePage(username): '''文章页面''' print('欢迎%s用户访问\033[31;1m文章\033[0m页面!' % username) return printMenu() @login @log def diaryPage(username): '''日记页面''' print('欢迎%s用户访问\033[31;1m日记\033[0m页面!' % username) return printMenu() @login @log def commentPage(username): '''评论页面''' print('欢迎%s用户访问\033[31;1m评论\033[0m页面!' % username) return printMenu() @login @log def collectionPage(username): '''收藏页面''' print('欢迎%s用户访问\033[31;1m收藏\033[0m页面!' % username) return printMenu() def printMenu(): '''打印主菜单''' print('#' * 20) print('''欢迎来到博客园首页 1、登录博客园 2、注册新用户 3、文章页面 4、日记页面 5、评论页面 6、收藏页面 7、注销 8、退出程序''') print('#' * 20) def main(): '''主控制逻辑''' while True: choise = input('请选择:').strip() if '1' == choise: loginBlog() elif '2' == choise: register() elif '3' == choise: articlePage(dict_info['username']) elif '4' == choise: diaryPage(dict_info['username']) elif '5' == choise: commentPage(dict_info['username']) elif '6' == choise: collectionPage(dict_info['username']) elif '7' == choise: print('#' * 20) print('注销成功,已退出登录!') dict_info['login_status'] = False printMenu() elif '8' == choise: print('谢谢使用!') exit(-1) else: print('输入有误,请重新输入!') if __name__ == '__main__': printMenu() main()