1.寫一個(gè)簡(jiǎn)單的裝飾器登錄網(wǎng)站的過(guò)程
def login(func):2
def inner():5
name=input('name:')
if name=='xiaoming'
func() #:comment只不過(guò)是變量名
return inner 3
@login 其實(shí)它就相當(dāng)于調(diào)comment=login(comment) 1
def comment():
print('評(píng)論’)
comment() 4
2.編寫裝飾器垃帅,為多個(gè)函數(shù)加上認(rèn)證的功能(用戶的賬號(hào)密碼來(lái)源于文件)懂鸵,
要求登錄成功一次式矫,后續(xù)的函數(shù)都無(wú)需再輸入用戶名和密碼
注意:從文件中讀出字符串形式的字典捺檬,可以用eval('{"name":"xiaoming","password":"123"}')
轉(zhuǎn)成字典格式
定義一個(gè)字典看用戶登錄狀態(tài)
auth_status={
'user':None,
'status':False#狀態(tài)是沒(méi)有登錄
}
def wrapper(fun):
def inner(*args,**kwargs):
if auth_status['status']:#如果登錄了,就執(zhí)行fun函數(shù)
ret = fun(*args, **kwargs) # index/home
return ret
else:#如果沒(méi)有登錄状知,就實(shí)現(xiàn)認(rèn)證功能
username = input('name:>>').strip()#獲取用戶名
password = input('password:>>').strip()#獲取密碼
f=open('login.txt','r',encoding='utf-8')#打開(kāi)文件獲取用戶的信息
user_dic=f.read()#讀出來(lái)的是字符串類型
zhddict=eval(user_dic)#轉(zhuǎn)換成字典類型
#print(type(zhddict))#查看eval轉(zhuǎn)換后的類型
if zhddict.get(username) and password == zhddict[username]:#如果用戶名和密碼都正確秽五,就顯示登陸成功,不正確就顯示登錄失敗
print('login successful')
auth_status['user']=username #登陸成功后就把用戶名放在user里
auth_status['status']=True 狀態(tài)改為True
ret = fun(*args,**kwargs)#index/home
return ret
else:
print('login faild')
return inner
@wrapper #語(yǔ)法糖
def index():
print("歡迎來(lái)到首頁(yè)")
@wrapper
def home():
print("歡迎回家")
index()
index()
home()
index()
3.編寫下載網(wǎng)頁(yè)內(nèi)容的函數(shù)试幽,
要求功能是:用戶傳入一個(gè)url筝蚕,函數(shù)返回下載頁(yè)面的結(jié)果
編寫裝飾器,實(shí)現(xiàn)緩存網(wǎng)頁(yè)內(nèi)容的功能:
具體:實(shí)現(xiàn)下載的頁(yè)面存放于文件中铺坞,如果文件內(nèi)有值(文件大小不為0)起宽,就優(yōu)先從文件中讀取網(wǎng)頁(yè)內(nèi)容,
否則济榨,就去下載坯沪,然后存到文件中
from urllib.request import urlopen
url_l=[]#存放
def huancun(func):
'''
實(shí)現(xiàn)緩存網(wǎng)頁(yè)內(nèi)容的功能
'''
def inner(*args,**kwargs):#args傳的就是url,那么得到url就得用url = args[0]
url = args[0] # 取url
filename=str(hash(url))#用hash算法吧url轉(zhuǎn)換為數(shù)字作為文件名擒滑,但是數(shù)字不能作為文件名腐晾,必須轉(zhuǎn)換成str類型
if url in url_l:#如果url已經(jīng)在列表里了叉弦,就說(shuō)明你已經(jīng)下載過(guò)了,就不需要在執(zhí)行func了,就直接打開(kāi)就行了
f=open(filename,'rb')
ret=f.read()
else:#如果不在列表里就要把添加到url列表
url_l.append(url)
ret = func(*args, **kwargs)
f=open(filename,'wb')#打開(kāi)文件
f.write(ret)#并且用寫的方式把它寫進(jìn)文件里
f.close()
return ret
return inner
@huancun#get=huancun(get)
def get(url):#定義一個(gè)get函數(shù)
return urlopen(url).read()#返回讀取的網(wǎng)頁(yè)
print(get('http://www.people.com.cn'))
print(get('http://www.people.com.cn'))#調(diào)用get方法藻糖,傳一個(gè)'http://www.people.com.cn'網(wǎng)址進(jìn)去
print(get('http://www.people.com.cn'))