|
@@ -8,7 +8,10 @@
|
|
|
"""
|
|
|
from __future__ import absolute_import
|
|
|
|
|
|
+import sys
|
|
|
+
|
|
|
from kombu.utils import cached_property
|
|
|
+from kombu.utils.encoding import bytes_to_str, ensure_bytes
|
|
|
|
|
|
from celery.exceptions import ImproperlyConfigured
|
|
|
from celery.utils.functional import LRUCache
|
|
@@ -19,6 +22,8 @@ __all__ = ['CacheBackend']
|
|
|
|
|
|
_imp = [None]
|
|
|
|
|
|
+PY3 = sys.version_info[0] == 3
|
|
|
+
|
|
|
REQUIRES_BACKEND = """\
|
|
|
The memcached backend requires either pylibmc or python-memcached.\
|
|
|
"""
|
|
@@ -31,7 +36,7 @@ Please use one of the following backends instead: {1}\
|
|
|
|
|
|
def import_best_memcache():
|
|
|
if _imp[0] is None:
|
|
|
- is_pylibmc = False
|
|
|
+ is_pylibmc, memcache_key_t = False, ensure_bytes
|
|
|
try:
|
|
|
import pylibmc as memcache
|
|
|
is_pylibmc = True
|
|
@@ -40,17 +45,22 @@ def import_best_memcache():
|
|
|
import memcache # noqa
|
|
|
except ImportError:
|
|
|
raise ImproperlyConfigured(REQUIRES_BACKEND)
|
|
|
- _imp[0] = (is_pylibmc, memcache)
|
|
|
+ else:
|
|
|
+ memcache_key_t = bytes_to_str if PY3 else ensure_bytes
|
|
|
+ _imp[0] = (is_pylibmc, memcache, memcache_key_t)
|
|
|
return _imp[0]
|
|
|
|
|
|
|
|
|
def get_best_memcache(*args, **kwargs):
|
|
|
- behaviors = kwargs.pop('behaviors', None)
|
|
|
- is_pylibmc, memcache = import_best_memcache()
|
|
|
- client = memcache.Client(*args, **kwargs)
|
|
|
- if is_pylibmc and behaviors is not None:
|
|
|
- client.behaviors = behaviors
|
|
|
- return client
|
|
|
+ is_pylibmc, memcache, key_t = import_best_memcache()
|
|
|
+ Client = _Client = memcache.Client
|
|
|
+
|
|
|
+ if not is_pylibmc:
|
|
|
+ def Client(*args, **kwargs): # noqa
|
|
|
+ kwargs.pop('behaviors', None)
|
|
|
+ return _Client(*args, **kwargs)
|
|
|
+
|
|
|
+ return Client, key_t
|
|
|
|
|
|
|
|
|
class DummyClient(object):
|
|
@@ -75,10 +85,10 @@ class DummyClient(object):
|
|
|
return self.cache.incr(key, delta)
|
|
|
|
|
|
|
|
|
-backends = {'memcache': lambda: get_best_memcache,
|
|
|
- 'memcached': lambda: get_best_memcache,
|
|
|
- 'pylibmc': lambda: get_best_memcache,
|
|
|
- 'memory': lambda: DummyClient}
|
|
|
+backends = {'memcache': get_best_memcache,
|
|
|
+ 'memcached': get_best_memcache,
|
|
|
+ 'pylibmc': get_best_memcache,
|
|
|
+ 'memory': lambda: (DummyClient, ensure_bytes)}
|
|
|
|
|
|
|
|
|
class CacheBackend(KeyValueStoreBackend):
|
|
@@ -100,7 +110,7 @@ class CacheBackend(KeyValueStoreBackend):
|
|
|
self.servers = servers.rstrip('/').split(';')
|
|
|
self.expires = self.prepare_expires(expires, type=int)
|
|
|
try:
|
|
|
- self.Client = backends[self.backend]()
|
|
|
+ self.Client, self.key_t = backends[self.backend]()
|
|
|
except KeyError:
|
|
|
raise ImproperlyConfigured(UNKNOWN_BACKEND.format(
|
|
|
self.backend, ', '.join(backends)))
|