金字塔与memcached:如何使其工作?错误 - MissingCacheParameter:url是必需的

时间:2012-02-04 20:21:35

标签: python memcached pyramid beaker

我在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

我在docs中找到的唯一.ini设置是关于使用内存和文件类型的缓存。但我需要使用memcached。

首先,我已经从Ubuntu官方存储库和memcached安装了包python-memcached到我的virtualenv。

.ini文件中,我已替换cache.type = memory - > cache.type = memcached。我有下一个错误:

  

beaker.exceptions.MissingCacheParameter

     

MissingCacheParameter:url是必需的

我做错了什么?

提前致谢!

1 个答案:

答案 0 :(得分:4)

因此,使用TurboGears documentation作为指南,您对网址有什么设置?

[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 requires a 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时,我遇到了下一个错误:AttributeError:   'MemcachedNamespaceManager'对象没有属性'lock_dir'

我说我读下面代码的方式,您必须提供lock_dirdata_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'