函数闭包为函数加上认证功能
def auth_func(func):
def wrapper(*args,**kwargs):
username = input('用户名:').strip()
passwd = input('密码:').strip()
if username == 'sb' and passwd == '123':
res = func(*args,**kwargs)
return res
else:
print('用户名或者密码错误')
return wrapper
@auth_func
def index():
print('欢迎来到京东')
@auth_func
def shopping_car(name):
print('%name的购物车里有%s,%s,%s' %(name,'a','b','c')) #这句的第一个%s不能写成%name,不然报错!!
index()
shopping_car('产品经理')
输出结果:
用户名:>? sb
密码:>? 123
欢迎来到京东
用户名:>? d
密码:>? s
用户名或者密码错误
以上程序的缺点是,每次刷新页面都要求重新输入用户名和密码
使用全局变量进行调整
user_dic = {'username':None,'login':False} #新增
def auth_func(func):
def wrapper(*args,**kwargs):
if user_dic['username'] and user_dic['login']: #新增
res = func(*args, **kwargs) #新增
return res #新增
username = input('用户名:').strip()
passwd = input('密码:').strip()
if username == 'sb' and passwd == '123':
user_dic['username'] = username #新增
user_dic['login'] = True #新增
res = func(*args,**kwargs)
return res
else:
print('用户名或者密码错误')
return wrapper
@auth_func
def index():
print('欢迎来到京东')
@auth_func
def shopping_car(name):
print('%s的购物车里有[%s,%s,%s]' %(name,'a','b','c'))
index()
shopping_car('产品经理')
执行index()的时候要输入用户名和密码;执行shopping_car('产品经理')的时候就不用重新输入用户名和密码了。
小插曲:刚开始这个程序运行老师出错,看了半天才看出有个小错误:
print('%s的购物车里有[%s,%s,%s]' %(name,'a','b','c'))
这句话被写成:
print('%name的购物车里有[%s,%s,%s]' %(name,'a','b','c'))
所以报错
注意:后面%(name,'a','b','c')中的name也不要忘了写!!
以上程序的缺点是,把用户名和密码写死了(用户名为sb,密码为123)。应该改成:将用户输入的用户名和密码与公司user_list中的条目匹配,如果配对成功,则可以登陆,如果配对不成功,则返回“用户名或者密码输入错误”
user_list=[
{'name':'alex','passwd':'123'},
{'name':'linhaifeng','passwd':'123'},
{'name':'wupeiqi','passwd':'123'},
{'name':'yuanhao','passwd':'123'},
] #新增的用户匹配列表
current_dic = {'username':None,'login':False}
def auth_func(func):
def wrapper(*args,**kwargs):
if current_dic['username'] and current_dic['login']:
res = func(*args, **kwargs)
return res
username = input('用户名:').strip()
passwd = input('密码:').strip()
for user_dic in user_list: #新增的for else循环
if user_dic['name'] == username and user_dic['passwd'] == passwd:
current_dic['username'] = username
current_dic['login'] = True
res = func(*args, **kwargs)
return res
else:
print('用户名或者密码错误')
return wrapper
@auth_func
def index():
print('欢迎来到京东')
@auth_func
def shopping_car(name):
print('%s的购物车里有[%s,%s,%s]' %(name,'a','b','c'))
index()
shopping_car('产品经理')
####输出:
用户名:>? alex
密码:>? 123
欢迎来到京东
产品经理的购物车里有[a,b,c]
给程序加上认证类型的选择功能(带参数装饰器)
user_list=[
{'name':'alex','passwd':'123'},
{'name':'linhaifeng','passwd':'123'},
{'name':'wupeiqi','passwd':'123'},
{'name':'yuanhao','passwd':'123'},
]
current_dic = {'username':None,'login':False}
def auth(auth_type = 'filedb'):
def auth_func(func):
def wrapper(*args,**kwargs):
print('认证类型是',auth_type)
if auth_type == 'filedb':
if current_dic['username'] and current_dic['login']:
res = func(*args, **kwargs)
return res
username = input('用户名:').strip()
passwd = input('密码:').strip()
for user_dic in user_list:
if user_dic['name'] == username and user_dic['passwd'] == passwd:
current_dic['username'] = username
current_dic['login'] = True
res = func(*args, **kwargs)
return res
else:
print('用户名或者密码错误')
elif auth_type == 'ldap':
print('鬼才知道怎么玩儿')
res = func(*args, **kwargs)
return res
else:
print('鬼才知道你用的是什么类型')
res = func(*args, **kwargs)
return res
return wrapper
return auth_func
@auth(auth_type='filedb') #auth_func=auth(auth_type='filedb')---->相当于@auth_func,也就是相当于index=auth_func(index),还附加了一个auth_type
def index():
print('欢迎来到京东')
@auth(auth_type='ldap')
def home(name):
print('欢迎回家%s' %name)
@auth(auth_type='ssssssss')
def shopping_car(name):
print('%s的购物车里有[%s,%s,%s]' %(name,'a','b','c'))
index() #其实执行的是wrapper
home('产品经理')
shopping_car('产品经理')