2015-07-04 5 views
1

Я следующую структуру:Кэширование результата метод класса по запросу

class Entry: 
    def has_items(self, request: Request) -> bool: 
     pass 

Что бы Pyramistic подход кэшировать оценки has_items() так что

  • Он вычисляется только один раз для каждого запроса

  • Кэш-ключ является самим экземпляром записи (id(entry))

  • Хранилище кэша может (естественно?) Быть на самом объекте запроса

+0

Возможно, вы ищете http://docs.pylonsproject.org/projects/pyramid//en/latest/api/config.html#pyramid.config.Configurator.add_request_method? – matino

ответ

1

Как Матино уже было сказано, я также считаю, что config.add_request_method это способ сделать это. Я имею в своем коде следующее:

config.add_request_method(get_current_user_groups, 'groups', reify=True) 

Это делает один вызов get_current_user_groups с request в качестве единственного аргумента. reify=True сообщает, что он кэширует результат как свойство. Теперь любой вызов request.groups дает мне список групп для этого пользователя.

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

+0

Ницца. Проблема заключается в том, что я не хочу загрязнять пространство имен объектов запроса методами, которые на самом деле там не принадлежат. –

+0

Ах .. ну, вы также можете использовать декоратор 'reify' (http://docs.pylonsproject.org/projects/pyramid/en/latest/api/decorator.html) –

+1

Это может быть хорошим aproach, так как ваш метод 'has_items' уже зависит от запроса (не уверен, что это хороший дизайн, хотя). В качестве альтернативы вы можете использовать https://pypi.python.org/pypi/pyramid_dogpile_cache/0.0.4 или https://github.com/Pylons/pyramid_beaker и реализовать свою собственную стратегию кэширования. – matino

Смежные вопросы