Search code examples
pythonmemcachedpyramidbeaker

Pyramid with memcached: how to make it work? Error - MissingCacheParameter: url is required


I have site on Pyramid framework and want to cache with memcached. For testing reasons I've used memory type caching and everything was OK. I'm using pyramid_beaker package. Here is my previous code (working version).

In .ini file

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

In views.py:

from beaker.cache import cache_region

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

The only .ini settings I've found in docs were about working with memory and file types of caching. But I need to work with memcached.

First of all I've installed package memcached from Ubuntu official repository and also python-memcached to my virtualenv.

In .ini file I've replaced cache.type = memory -> cache.type = memcached. And I've got next error:

beaker.exceptions.MissingCacheParameter

MissingCacheParameter: url is required

What am I doing wrong?

Thanks in advance!


Solution

  • So, using the TurboGears documentation as a guide, what settings do you have for the 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
    

    It looks to me as if memcached requires a url to initialize correctly:

    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") 
    

    I am not really sure why the code allows url to be optional (defaulting to None) and then requires it. I think it would have been simpler just to require the url as an argument.


    Later: in response to your next question:

    when I used cache.url I've got next error: AttributeError: 'MemcachedNamespaceManager' object has no attribute 'lock_dir'

    I'd say that the way I read the code below, you have to provide either lock_dir or data_dir to initialize 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)
    

    You can replicate that exact error using this test code:

    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()
    

    It turns out like this:

    >>> 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'