2012-02-22 8 views
9

私はセットアップはこのような何かを探しています私のDjangoビューデコレータがリクエストを渡されないのはなぜですか?

def foo_decorator(function): 
    @wraps(function) 
    def decorator(*args, **kwargs): 
     print kwargs 
     return function(*args, **kwargs) 

    return decorator 

@foo_decorator 
def analytics(request, page_id, promotion_id): 
    pass 

出力中:

{'promotion_id': u'11','page_id': u'119766481432558'} 

なぜ私のデコレータが渡さrequestを取得していませんか?

答えて

22

は、ビューのキーワード引数ではありません。最初の位置引数です。 args[0]としてアクセスできます。

def foo_decorator(function): 
    @wraps(function) 
    def decorator(*args, **kwargs): 
     print args[0] 
     return function(*args, **kwargs) 

    return decorator 

私はあなたが明示的にrequestを含めるように関数のシグネチャを変更することをお勧めします:

def foo_decorator(function): 
    @wraps(function) 
    def decorator(request, *args, **kwargs): 
     print request 
     return function(request, *args, **kwargs) 

    return decorator 
+0

「機能」を呼び出すときにあなたがkwargsの前に**欠けていると思います –

+0

ありがとうPatrik、今修正されました。 – Alasdair

4

リクエストはキーワード引数として渡されません。それはargsで、kwargsではありません。

+1

ほら、私は混乱して良い時間を過ごした後、これを実現。最終的に電球が上がり、 'args'には' kwargs'にないものが入ることがありました!私のおかしい。ありがとう! –

関連する問題