【菜鸟零基础学习笔记】Day20-函数闭包为函数加上认证功能

函数闭包为函数加上认证功能

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('产品经理')

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值