Почему мой Django View Decorator не получает запрос на него? - PullRequest
9 голосов
/ 22 февраля 2012

У меня есть установка, которая выглядит примерно так:

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, передаваемый ему?

Ответы [ 2 ]

23 голосов
/ 22 февраля 2012

request не является ключевым аргументом представления, это первый позиционный аргумент. Вы можете получить к нему доступ как 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
4 голосов
/ 22 февраля 2012

Запрос не передается в качестве ключевого аргумента. Это в args, а не kwargs.

...