2009-11-27 41 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