为多个函数加上认证功能(用户账号密码来源于文件)
#编写装饰器,为多个函数加上认证功能(用户账号密码来源于文件)
#要求登陆成功一次,后续的函数都无序输入用户名密码
FLAG = 0
def login(f):
def inner(*args, **kwargs):
global FLAG
if FLAG:
ret = f(*args, **kwargs)
return ret
else:
usr_name = input("请输入用户名:").strip()
usr_psd = input("请输入密码:").strip().lower()
with open('usr_info.txt', encoding='utf-8') as file_op:
for line in file_op:
if usr_name == line.strip().split()[0]:
if usr_psd == line.strip().split()[1]:
FLAG = 1
break
else:
print("密码错误!")
break
else:
print("无此用户!")
if FLAG:
ret = f(*args, **kwargs)
return ret
else:
print("无效登录状态")
return inner
@login
def index():
print("This is the index page")
def in_number(f):
def inner(*args, **kwargs):
l1 = []
l = input("输入数字:").split()
for i in l:
l1.append(int(i))
ret = f(*args, *l1, **kwargs)
return ret
return inner
@login
@in_number
def plus(*args):
count = 0
for i in args:
count += i
return count
index()
print(plus(2, 5, 8))
编写装饰器,为多个函数加上记录功能
#编写装饰器,为多个函数加上记录功能,每次调用函数,都记录进文件
from functools import wraps
def txt_log(f):
def inner(*args, **kwargs):
ret = f(*args, **kwargs)
with open("func_log.txt", mode='a', encoding='utf-8') as file_wr:
file_wr.writelines("{}\n".format(f.__name__))
return ret
return inner
@txt_log
def main(a, b):
return a + b
@txt_log
def show_index():
print("This is a index page")
print(main(2, 3))
show_index()
实现缓存网页内容功能
#下载网页内容的函数,用户输入URL,函数返回下载页面的结果
#编写装饰器,实现缓存网页内容功能
#具体:下载的页面放于文件中,如果文件内有值,就优先从文件中读取,否则,去下载,存入文件
import urllib
import os
from urllib.request import urlopen
def cache_page(func):
def inner(*args, **kwargs):
if os.path.getsize('web_cache'):
with open('web_cache', 'rb') as f:
return f.read()
ret = func(*args, **kwargs)
with open('web_cache', 'wb') as f:
f.write(ret)
return ret
return inner
def input_url(f):
def inner(*args, **kwargs):
url = input("输入网页地址:")
ret = f(*args, url, **kwargs)
return ret
return inner
# @input_url
@cache_page
def get_page(*args, **kwargs):
code = urlopen(*args).read()
return code
print(get_page('http://www.baidu.com'))
print(get_page('http://www.baidu.com'))