2009-11-27 76 views
1
from decorator import decorator 
from pylons.decorators.util import get_pylons 

def allowed_roles(roles): 
    def wrapper(func, *args, **kwargs): 
     session = get_pylons(args).session 
     # edit pylons session here. 
     return func(*args, **kwargs) 
    return decorator(wrapper) 

任何人都可以解释它是如何工作的吗?塔塔装饰工作原理

+0

这对我来说看起来很奇怪 - 不太明白为什么'session'被定义但从未被引用。可能错过了一些愚蠢的事情。 – 2009-11-27 09:54:58

+0

allowed_roles,“roles”的参数也不被使用。 ? – unutbu 2009-11-27 10:07:24

回答

2

像任何其他装饰作品 -

装饰器是接收一个函数作为自变量的函数,并返回另一个功能。 返回的函数将从原始函数中“占位”。

由于decoratos所需的效果通常是能够在原始函数(被装饰的)运行之前和之后运行一些代码,所以装饰器创建一个新的函数,该函数接受任意数量的匿名和命名参数( *前缀“args”和**前缀“kwargs”分别负责将参数存储在一个列表和一个字典中)

在这个新函数里面,你有一个地方可以写你的验证码 - 然后它调用原始函数 - 在此上下文中称为“func”,并返回其原始值。

“decorator.decorator”调用并非严格需要:它只是修改包装函数的一些ttrbitues,使其看起来更接近于原始函数(如'func_name'属性) - 但代码应该可以工作没有它。

定义一个装饰器之后,你必须将它应用到你想装饰的函数或方法上:只要在你想装饰的函数定义的前面加一个@allowed_roles即可。

+1

(及时:这不是专用于挂架 - 这种装饰功能或方法的方式是Python功能 – jsbueno 2009-11-27 12:10:24