2011-08-20 213 views
1

我有基於OpenID提供程序的登錄系統,我想創建類似@login_required的裝飾器。但我有一個問題 - 我需要檢查每個對象的許可。我將id傳遞給了我的視圖,所以我想知道是否有任何方法將它傳遞給裝飾器,或者這是不可能的,我需要在我的視圖中檢查用戶權限。有沒有辦法將變量傳遞給裝飾器?

+1

可能的重複[Understanding Python decorators](http://stackoverflow.com/questions/739654/understanding-python-decorators)。這是一箇舊帖子,但它有很多很好的信息。 –

+0

是的,謝謝,我正在尋找Django裝飾器,所以錯過了這篇文章。它真的幫助我。 – Lertmind

回答

3
def outer(var1, var2): 
    def inner(func) 
     func.foo = var1 
     func.bar = var2 
     return func 
    return inner 

@outer(myvar1, myvar2) 
def myfunc(): 
    # whatever 
    pass 

雖然你不能直接傳遞變量到你的裝飾功能的功能,你可以創建另一個函數outer),調用它時,返回裝飾功能inner)。您通過outer函數變量,它們可用於inner函數。這被稱爲封閉。

3

取決於當你需要做的東西,你可能需要包裝的兩個級別的ID,你有什麼是你需要做的的方法被調用之前更換print(permission_id)上:

def login_required(permission_id): 
    def decorator(func): 
     def method(self, *args, **kw): 
      print(permission_id) 
      return func(self, *args, **kw) 
     return method 
    return decorator 

class foo(object): 

    @login_required('foo') 
    def bar(self): 
     print('bar') 

foo = foo() 
print('instantiated') 
foo.bar() 

輸出:

instantiated 
foo 
bar 
+0

也許最有趣的事情是定義的函數「方法」是一個**真正的方法**。自引用的行爲與預期相同,暴露了一個活的對象來玩。 –

相關問題