Как реализовать два декоратора в Python, оба из которых в конечном итоге захотят вызвать вызывающую функцию - PullRequest
0 голосов
/ 06 августа 2011

Я пытаюсь просто обработчики моих веб-приложений, используя декораторы Python.

По сути, я хочу использовать декораторы для абстрагирования кода, который проверяет аутентифицированные сеансы, и другого, который проверяет, есть ли у поставщика кэша (в данном случае Memcache) подходящий ответ.

Рассмотрим определение этого метода с декораторами:

@auth.login_required
@cache.clear
def post(self, facility_type_id = None):

auth.login_required проверяет, вошел ли пользователь в систему, в противном случае возвращает соответствующее сообщение об ошибке или выполняет исходную функцию.

cache.clear проверит наличие определенного ключа в кеше и сбросит его, прежде чем выполнит вызывающий метод.

И auth.login_required, и cache.clear хотели бы в конечном итоге выполнить вызывающий метод (post).

Из того, что я прочитал оба, выполнение того, что я делаю сейчас, будет выполнять вызывающий метод (post) дважды.

Мой вопрос, как мне связать декораторы, которые в конечном итоге выполняют вызывающий метод, но гарантируют, что он вызывается только один раз.

Ценю любые указатели и спасибо за ваше время.

Ответы [ 2 ]

4 голосов
/ 06 августа 2011

Каждый последующий декоратор получает ранее упакованную функцию, поэтому сама функция вызывается только один раз в конце цепочки.Вот простой пример:

def dec1(f):
    def wrapped():
        print 'dec1'
        return f()
    return wrapped

def dec2(f):
    def wrapped():
        print 'dec2'
        return f()
    return wrapped

@dec2
@dec1
def spam(): print 'spam'

>>> spam()
dec2
dec1
spam
1 голос
/ 06 августа 2011

Вы не поняли, как работают декораторы.

Два декоратора уже "секвенированы".Внешний получит как функцию, чтобы действовать на уже оформленную функцию.Внутренняя функция не будет вызываться дважды.

...