为什么我的Django视图装饰器没有将请求传递给它?

Kit*_*nde 9 python django decorator

我的设置看起来像这样:

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
Run Code Online (Sandbox Code Playgroud)

输出:

{'promotion_id': u'11','page_id': u'119766481432558'}
Run Code Online (Sandbox Code Playgroud)

为什么我的装饰师没有被request传递给它?

Ala*_*air 23

request它不是视图的关键字参数,它是第一个位置参数.你可以访问它args[0].

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

    return decorator
Run Code Online (Sandbox Code Playgroud)

我建议您更改功能签名以request明确包含:

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

    return decorator
Run Code Online (Sandbox Code Playgroud)


Dan*_*man 5

请求不作为关键字参数传递。它在args,不是kwargs