带参数的装饰

应用场景举例:
网站有三个页面,分别是index、home、bbs,原来均不需要认证即可进入;
现需求有变:1)index页面保持原样,无需认证
      2)home页面需要通过本地文件认证;
      3)bbs需要通过公司LDAP进行认证

由于不希望修改原home()、index()、bbs()的代码,也不希望修改上述三个函数的调用方式和执行结果,决定采用装饰器的方式进行,由于home()和bbs()采用了不同的认证仍是,因此在装饰时需要带入认证方式,具体装饰如下:

@auth(auth_type = "local")
def home():
    print("Welcome to home pages!")
    return "From Home Page\n"

@auth(auth_type = "ldap")
def bbs():
    print("Welcome to bbs pages!\n")
View Code

为了接收装饰中带入的参数,两层嵌套的装饰器函数已经不能满足需求,需要引入三层装饰器函数,具体代码如下:

#!/usr/bin/evn python
# -*- coding: utf-8 -*-
#Author: Johnson Chen

#Function:
# 网站有三个页面,分别是index、home、bbs,原来均不需要认证即可进入;
# 现需求有变:1)index页面保持原样,无需认证
#             2)home页面需要通过本地文件认证;
#             3)bbs需要通过公司LDAP进行认证



username, password = "ccz320","abc123"

def ldapAuth(iUsername,iPassword):
    print("Authencated by LDAP, pass!")
    return True

def auth(auth_type):
    "装饰器通过引入auth_type方式,运行在装饰的过程中传入认证方式"

    def outer_wrapper(func):

        #wrapper()是真正的用于替换被装饰函数的替代品
        def wrapper(*args, **kwargs):
            iUser = input("Username:")
            iPass = input("Password:")

            #如果装饰器带入的认证方式是local,则通过本地文件进行认证
            if auth_type == "local":
                if iUser == username and iPass == password:
                    return func(*args, **kwargs)
                else:
                    exit("\033[41;1mInvalid username or password!\033[0m")

            #如果装饰器带入的认证方式是ldap,则通过ldapAuth()进行认证
            elif auth_type =="ldap":
                if ldapAuth(iUser, iPass):
                    return func(*args, **kwargs)
                else:
                    exit("\033[41;1mInvalid username or password!\033[0m")

        return wrapper
    return outer_wrapper


def index():
    print("Welcome to index pages!\n")

@auth(auth_type = "local")
def home():
    print("Welcome to home pages!")
    return "From Home Page\n"

@auth(auth_type = "ldap")
def bbs():
    print("Welcome to bbs pages!\n")


index()
print(home())
bbs()
View Code

执行结果如下:

Welcome to index pages!

Username:ccz320
Password:abc123
Welcome to home pages!
From Home Page

Username:ccz
Password:123
Authencated by LDAP, pass!
Welcome to bbs pages!

转载于:https://www.cnblogs.com/ccz320/p/6553552.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值