Как использовать кэширование мензурки в Pyramid? - PullRequest
9 голосов
/ 19 февраля 2011

В моем файле ini есть следующее:

cache.regions = default_term, second, short_term, long_term
cache.type = memory
cache.second.expire = 1
cache.short_term.expire = 60
cache.default_term.expire = 300
cache.long_term.expire = 3600

И это в моем __init__.py:

from pyramid_beaker import set_cache_regions_from_settings
set_cache_regions_from_settings(settings)

Однако я не уверен, как выполнитьфактическое кэширование в моих представлениях / обработчиках.Доступен ли декоратор?Я подумал, что в API response будет что-то, но доступно только cache_control - что дает пользователю команду кэшировать данные.Не кэшируйте его на стороне сервера.

Есть идеи?

Ответы [ 5 ]

12 голосов
/ 27 ноября 2011

Моя ошибка состояла в том, что я вызывал функцию декоратора @ cache_region для вызываемого вида. Я не получил сообщений об ошибках, но не было никакого реального кэширования. Итак, в моем views.py я пытался как:

@cache_region('long_term')
def photos_view(request):
    #just an example of a costly call from Google Picasa
    gd_client = gdata.photos.service.PhotosService()
    photos = gd_client.GetFeed('...')
    return {
        'photos': photos.entry
    }

Нет ошибок и нет кеширования. Также ваш view-callable начнет требовать другой параметр! Но это работает:

#make a separate function and cache it
@cache_region('long_term')
def get_photos():
    gd_client = gdata.photos.service.PhotosService()
    photos = gd_client.GetFeed('...')
    return photos.entry

А потом в представлении, вызываемом просто:

def photos_view(request):
    return {
        'photos': get_photos()
    }

Так же, как это работает для @ cache.cache и т. Д.

Резюме: не пытайтесь кэшировать вызываемые представления .

PS. У меня все еще есть небольшое подозрение, что представление вызываемых объектов может быть кэшировано:)

UPD .: Как позже объясняет hlv, когда вы кэшируете view-callabe, кэш фактически никогда не срабатывает, потому что @ cache_region использует параметр запроса параметра callable в качестве идентификатора кэша. И запрос уникален для каждого запроса.

6 голосов
/ 14 марта 2012

Кстати ... причина, по которой он не работал при вызове view_callable (request), заключается в том, что параметры функции помещаются в ключ кеша для последующего поиска в кеше.так как «self» и «request» меняются для каждого запроса, возвращаемые значения действительно кэшируются, но никогда не могут быть снова найдены.вместо этого ваш кэш раздувается множеством бесполезных ключей.

я кеширую части своих функций просмотра, определяя новую функцию внутри вызываемого представления, например

    def view_callable(self, context, request):

        @cache_region('long_term', 'some-unique-key-for-this-call_%s' % (request.params['some-specific-id']))
        def func_to_cache():
            # do something expensive with request.db for example
            return something
        return func_to_cache()

пока что ..

ура

4 голосов
/ 23 февраля 2011

Вы должны использовать область кэша:

from beaker.cache import cache_region

@cache_region('default_term')
def your_func():
    ...
2 голосов
/ 13 апреля 2012

Подсказка для тех, кто использует @cache_region для функций, но не кэширует их результаты - убедитесь, что параметры функции являются скалярными.

Пример A (не кэшируется):

@cache_region('hour')
def get_addresses(person):
    return Session.query(Address).filter(Address.person_id == person.id).all()

get_addresses(Session.query(Person).first())

Пример B (делает кеширование):

@cache_region('hour')
def get_addresses(person):
    return Session.query(Address).filter(Address.person_id == person).all()

get_addresses(Session.query(Person).first().id)

Причина в том, что параметры функции используются в качестве ключа кеширования - что-то вроде get_addresses_123.Если объект передан, этот ключ не может быть сделан.

1 голос
/ 20 февраля 2011

Та же проблема здесь, вы можете выполнить кэширование, используя параметры по умолчанию с

from beaker.cache import CacheManager

а затем декораторы типа

@cache.cache('get_my_profile', expire=60)

похоже на http://beaker.groovie.org/caching.html,, но я не могу найти решение, как заставить его работать с конфигурацией пирамиды .ini.

...