Пирамида с memcached: как заставить это работать?Ошибка - MissingCacheParameter: требуется URL - PullRequest
3 голосов
/ 05 февраля 2012

У меня есть сайт на платформе Pyramid, и я хочу кэшировать с memcached.По причинам тестирования я использовал кэширование типов памяти, и все было в порядке.Я использую pyramid_beaker пакет.Вот мой предыдущий код (рабочая версия).

В .ini файле

cache.regions = day, hour, minute, second
cache.type = memory
cache.second.expire = 1
cache.minute.expire = 60
cache.hour.expire = 3600
cache.day.expire = 86400

В views.py:

from beaker.cache import cache_region

@cache_region('hour')
def get_popular_users():
    #some code to work with db
return some_dict

Единственные .ini настройкиЯ нашел в документах о работе с памятью и типами файлов кэширования.Но мне нужно работать с memcached.

Прежде всего я установил пакет memcached из официального репозитория Ubuntu, а также python-memcached в мой virtualenv.

В файле .ini, который я заменил cache.type = memory -> cache.type = memcached.И у меня есть следующая ошибка:

beaker.exceptions.MissingCacheParameter

MissingCacheParameter: необходим URL-адрес

Что такоеЯ делаю не так?

Заранее спасибо!

1 Ответ

4 голосов
/ 05 февраля 2012

Итак, используя в качестве руководства документацию TurboGears , какие настройки у вас есть для URL?

[app:main]
beaker.cache.type = ext:memcached
beaker.cache.url = 127.0.0.1:11211
# you can also store sessions in memcached, should you wish
# beaker.session.type = ext:memcached
# beaker.session.url = 127.0.0.1:11211

Мне кажется, что memcached требует URL для правильной инициализации:

def __init__(self, namespace, url=None, data_dir=None, lock_dir=None, **params):
    NamespaceManager.__init__(self, namespace)

    if not url:
        raise MissingCacheParameter("url is required") 

Я не совсем уверен, почему код позволяет URL-адресу быть необязательным (по умолчанию None), а затем требует его.Я думаю, что было бы проще просто указать URL в качестве аргумента.


Позже: в ответ на ваш следующий вопрос:

, когда я использовал cache.url Iполучено следующее сообщение об ошибке: AttributeError: у объекта 'MemcachedNamespaceManager' нет атрибута 'lock_dir'

Я бы сказал, что при чтении кода ниже вы должны указать lock_dir или data_dir для инициализации self.lock_dir:

    if lock_dir:
        self.lock_dir = lock_dir
    elif data_dir:
        self.lock_dir = data_dir + "/container_mcd_lock"
    if self.lock_dir:
        verify_directory(self.lock_dir)

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

class Foo(object):
    def __init__(self, lock_dir=None, data_dir=None):
        if lock_dir:
            self.lock_dir = lock_dir
        elif data_dir:
            self.lock_dir = data_dir + "/container_mcd_lock"
        if self.lock_dir:
            verify_directory(self.lock_dir)

f = Foo()

Получается так:

>>> f = Foo()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 7, in __init__
AttributeError: 'Foo' object has no attribute 'lock_dir'
...