2013-11-01 37 views
3

所以我試圖爲我的django視圖製作一個裝飾器,並且我有它的工作。該裝飾看起來像向kwargs添加參數時出現錯誤

# Decorator for the function - update(request, extra=None) 
def check_super(view): 
    def wrapper(request, *args, **kwargs): 
     status = supercheck(request) 

     if status=="USER": 
      raise PermissionDenied 
     else: 
      args = [a for a in args] 
      kwargs = dict((k, v) for k, v in kwargs.items()) 
      kwargs.update({'status':status}) # Offending line 
      return view(request, *args, **kwargs) 

    return wrapper 

基本上我做的supercheck功能的檢查,我想的是,結果傳遞的另一種說法對我的功能,但該行的錯誤

update() got an unexpected keyword argument 'status' 
上述結果說明

kwargs只是一本字典,對不對?所以我應該可以像這樣添加新的綁定,但它一直給我那個錯誤。這樣做也會導致相同的錯誤

kwargs['status']=status 
+2

就是你包裹的功能也稱爲「更新」。我認爲有問題的一行是你在你標記的行下面調用view()的地方。你的第一行註釋中的「update」函數不接受稱爲「狀態」的kwarg –

+0

是的,我打包的函數被稱爲update。我認爲像在wrapper()中的return語句中那樣傳遞kwargs的全部要點是我可以爲它添加任意參數 –

+1

函數''f(** kwargs)''可以接受任意數量的關鍵字args,但'update(extra = None)''只需要一個關鍵字參數。 – CppLearner

回答

0

Bah,我想通了。結果我所要做的就是確保原始函數帶* args和** kwargs,這更容易推廣(因爲我不知道這些函數將如何)

所以我的函數update()現在有簽名

update(request, extra=None, *args, **kwargs) 

而且我可以在包裝它之前通過更新kwargs來傳遞「任意」關鍵字。感謝您的澄清。評論幫助我縮小了問題所在!

唯一需要注意的是,我進入狀態的更新功能與

kwargs['status'] 

,而不是僅僅

status 

這是不是太糟糕

2

我不知道你爲什麼這樣做 - 我無法在我的機器上重現它。

這就是說,最簡單的方法做你想做的是忘了擺弄指定參數和kwargs,只是做

else: 
    return view(request, *args, status=status, **kwargs) 

假設你知道view採取所謂的「地位」的說法。 (如果沒有,約翰司朋說,好,有你的問題。)

Here's a bit more on *args, **kwargs, and ** in functions.

這就是說,它看起來像所有你想要做的是檢查用戶通過您的supercheck功能。看看@user_passes_test decorator - 它確實是你想要的。

+0

問題是,原始視圖不採取「狀態」。這就是爲什麼我試圖將它包含在kwargs中,但它似乎並沒有讓我 –

+1

是的,你不能用kwargs做到這一點 - 你不能隨便傳遞這樣的參數。抱歉!也就是說,有一個更簡單的方法來做你想做的事 - 檢查傳入的編輯。 –

相關問題