Commit 4c5cea70 authored by Aymeric Augustin's avatar Aymeric Augustin
Browse files

Merge pull request #218 from mgrouchy/ticket_18582

Fixed #18582 -- Added a no-op close to BaseCache
parents cc0ac26f a2e927b7
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -231,6 +231,7 @@ answer newbie questions, and generally made Django that much better:
    Simon Greenhill <dev@simon.net.nz>
    Owen Griffiths
    Espen Grindhaug <http://grindhaug.org/>
    Mike Grouchy <http://mikegrouchy.com/>
    Janos Guljas
    Thomas Güttler <hv@tbz-pariv.de>
    Horst Gutmann <zerok@zerokspot.com>
+3 −5
Original line number Diff line number Diff line
@@ -134,11 +134,9 @@ def get_cache(backend, **kwargs):
            "Could not find backend '%s': %s" % (backend, e))
    cache = backend_cls(location, params)
    # Some caches -- python-memcached in particular -- need to do a cleanup at the
    # end of a request cycle. If the cache provides a close() method, wire it up
    # here.
    if hasattr(cache, 'close'):
    # end of a request cycle. If not implemented in a particular backend
    # cache.close is a no-op
    signals.request_finished.connect(cache.close)
    return cache

cache = get_cache(DEFAULT_CACHE_ALIAS)
+9 −0
Original line number Diff line number Diff line
@@ -6,15 +6,18 @@ import warnings
from django.core.exceptions import ImproperlyConfigured, DjangoRuntimeWarning
from django.utils.importlib import import_module


class InvalidCacheBackendError(ImproperlyConfigured):
    pass


class CacheKeyWarning(DjangoRuntimeWarning):
    pass

# Memcached does not accept keys longer than this.
MEMCACHE_MAX_KEY_LENGTH = 250


def default_key_func(key, key_prefix, version):
    """
    Default function to generate keys.
@@ -25,6 +28,7 @@ def default_key_func(key, key_prefix, version):
    """
    return ':'.join([key_prefix, str(version), key])


def get_key_func(key_func):
    """
    Function to decide which key function to use.
@@ -40,6 +44,7 @@ def get_key_func(key_func):
            return getattr(key_func_module, key_func_name)
    return default_key_func


class BaseCache(object):
    def __init__(self, params):
        timeout = params.get('timeout', params.get('TIMEOUT', 300))
@@ -221,3 +226,7 @@ class BaseCache(object):
        the new version.
        """
        return self.incr_version(key, -delta, version)

    def close(self, **kwargs):
        """Close the cache connection"""
        pass
+10 −0
Original line number Diff line number Diff line
@@ -785,6 +785,16 @@ nonexistent cache key.::
    However, if the backend doesn't natively provide an increment/decrement
    operation, it will be implemented using a two-step retrieve/update.


You can close the connection to your cache with ``close()`` if implemented by
the cache backend.

    >>> cache.close()

.. note::

    For caches that don't implement ``close`` methods it is a no-op.

.. _cache_key_prefixing:

Cache key prefixing
+4 −0
Original line number Diff line number Diff line
@@ -270,6 +270,10 @@ class BaseCacheTests(object):
        self.assertEqual(self.cache.decr('answer', -10), 42)
        self.assertRaises(ValueError, self.cache.decr, 'does_not_exist')

    def test_close(self):
        self.assertTrue(hasattr(self.cache, 'close'))
        self.cache.close()

    def test_data_types(self):
        # Many different data types can be cached
        stuff = {