函数闭包模拟session

根据上一个认证功能的问题 要解决的就是只需要登录一次 也就是登录一次之后的用户名跟密码可以保存下来让其他函数用-->全局变量

user_dic = {"user_name":None,"login":False}  #全局变量  注意None以及False一定要大写


def auth_func(func):
    def wrapped(*args,**kwargs):
        if user_dic["user_name"] and user_dic["login"] :  #这是跟全局变量相反的结果 如过login为Ture以及user_name不等于none
            res = func(*args, **kwargs)           #相反的结果说明已经登录好了 直接执行函数
            return res
        user_name = input("请输入用户名").strip()
        passwd = input("请输入密码").strip()
        if user_name == "sb" and passwd == "123":
            user_dic["user_name"] = user_name     #这一行以及下一行就是修改全局变量
            user_dic["login"] = True
            res = func(*args,**kwargs)
            return res
        else:
            print("用户名或密码错误")
    return wrapped


@auth_func
def index():
    print("欢迎来到京东")

@auth_func
def home(name):
    print("亲爱的%s,欢迎回家" %name)

@auth_func
def shopping_car(name):
    print("%s的购物车里有%s,%s" %(name,"tt","娃娃"))

index()
home("龙大哥")
shopping_car("龙大哥")
#升级版 这次是一个名单列表 用for循环依次遍历  

user_list=[ {'name':'alex','passwd':'123'}, {'name':'linhaifeng','passwd':'123'}, {'name':'wupeiqi','passwd':'123'}, {'name':'yuanhao','passwd':'123'},] current_dic = {"user_name":None,"login":False} def auth_func(func): def wrapped(*args,**kwargs): if current_dic["user_name"] and current_dic["login"] : res = func(*args, **kwargs) return res user_name = input("请输入用户名").strip() passwd = input("请输入密码").strip() for user_dic in user_list: if user_name == user_dic["name"] and passwd == user_dic["passwd"]: #利用for循环遍历用户名名单看输入的是否符合 current_dic["user_name"] = user_name current_dic["login"] = True res = func(*args, **kwargs) return res else: #这里的else往前提前了一个空格 因为需要等用户输入# 几次直到for循环遍历所有用户名才报错,而不是输入一次就报错 print("用户名或密码错误") return wrapped @auth_func def index(): print("欢迎来到京东") @auth_func def home(name): print("亲爱的%s,欢迎回家" %name) @auth_func def shopping_car(name): print("%s的购物车里有%s,%s" %(name,"tt","娃娃")) index() home("龙大哥") shopping_car("龙大哥")

 

#带参数验证功能装饰器 这个较难 可以不深究

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'): #这就是闭包 再创建一个函数做成闭包 确定用户认证 那么之后的函数都要回撤一个tab 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 username == user_dic['name'] and passwd == user_dic['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_func 得到的就是func 所以下面的引用要加括号就是直接运行func() @auth(auth_type='filedb') #auth_func=auth(auth_type='filedb')-->@auth_func 附加了一个auth_type --->index=auth_func(index) def index(): print('欢迎来到京东主页') @auth(auth_type='ldap') #因为用户认证的方式很多 如果要 def home(name): print('欢迎回家%s' %name) # @auth(auth_type='sssssss') def shopping_car(name): print('%s的购物车里有[%s,%s,%s]' %(name,'奶茶','妹妹','娃娃')) # print('before-->',current_dic) # index() # print('after--->',current_dic) # home('产品经理') shopping_car('产品经理')

 

posted on 2018-05-09 15:51  monster7  阅读(207)  评论(0编辑  收藏  举报

导航