2012-12-27 54 views
1

Iam在我的項目中使用Django裝飾器。 Iam使用帶參數的多個視圖,我需要調用1個裝飾器。Django裝飾器與多個​​視圖的參數

我只想要一個視圖來調用它的參數一次。但是,無論我在哪裏使用裝飾器,裝飾器都會給出每個視圖的值。

我想參數屬於我調用的特定視圖。

我的看法和裝飾爲:

def d(msg='my default message'): 
    def decorator(func): 
     print msg 
     def newfn(request, **kwargs): 
      return func(request, **kwargs) 
     return newfn 
    return decorator 

@d('This is working') 
def company_add(request): 
    return ... 

@d('Dont come') 
def company_list(request, comp_id = None): 
    return ... 

如果我叫company_add意見,蔭獲得輸出爲:

This is working 
Dont come 

但是我預期的結果是

This is working. 

誰能幫我僅打印屬於特定視圖的參數。

回答

3

當您纏繞功能與@d(arg),你實際上msg=arg運行裝飾功能之前運行d函數體,當然打印msg。您可以將print聲明別的地方,例如:

def d(msg='my default message'): 
    def decorator(func): 
     def newfn(request, **kwargs): 
      print msg 
      return func(request, **kwargs) 
     return newfn 
    return decorator 
+0

感謝ü這麼多.... – Raji

+0

@raji:等待給予好評) – alexvassel

2

的解決方案是移動print msg到newfn包裝的範圍。當您使用指定的參數調用裝飾器時,它會執行並導致上述行爲。

def d(msg='my default message'): 
    def decorator(func): 
     def newfn(request, **kwargs): 
      print msg # The message should be printed here. 
      return func(request, **kwargs) 
     return newfn 
    return decorator 
+0

這正是我的回答) – alexvassel

+0

感謝ü這麼多.... – Raji