Python 带memcached的金字塔:如何让它工作?错误-缺少CacheParameter:需要url

Python 带memcached的金字塔:如何让它工作?错误-缺少CacheParameter:需要url,python,memcached,pyramid,beaker,Python,Memcached,Pyramid,Beaker,我在金字塔框架上有一个站点,希望使用memcached进行缓存。出于测试原因,我使用了内存类型缓存,一切正常。我使用的是金字塔烧杯包装。 这是我以前的代码(工作版本) 在.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 = 86

我在金字塔框架上有一个站点,希望使用memcached进行缓存。出于测试原因,我使用了内存类型缓存,一切正常。我使用的是
金字塔烧杯
包装。 这是我以前的代码(工作版本)

.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一起工作

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

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

烧杯。异常。缺少缓存参数

MissingCacheParameter:需要url

我做错了什么

提前谢谢

那么,以作为指南,您对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
在我看来,似乎要正确初始化:

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是可选的(默认为无),然后需要它。我认为仅仅要求url作为参数会更简单


稍后:回答您的下一个问题:


当我使用cache.url时,我遇到了下一个错误:AttributeError: “MemcachedNamespaceManager”对象没有属性“lock\u dir”

我想说,按照我阅读下面代码的方式,您必须提供
lock\u dir
data\u dir
来初始化self.lock\u 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'
>f=Foo()
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“”,第7行,在_init中__
AttributeError:“Foo”对象没有属性“lock\u dir”

当我使用cache.url时,我遇到了下一个错误:
AttributeError:'memcachednamespacemanagemanager'对象没有属性'lock\u dir'
并且在我的代码中,url是必需的def\uu init\uuuuuuuu(self,namespace,url,memcache\u module='auto',data\u dir=None,lock\u dir=None,**kw):当我添加了
lock\u dir
后,一切都开始正常工作。但是为什么memcached需要这个目录呢?这是内存缓存,不是文件缓存。。。