问题
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!
回答1:
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'
来源:https://stackoverflow.com/questions/9144206/pyramid-with-memcached-how-to-make-it-work-error-missingcacheparameter-url