From 4738ab07e6dd989713f4759fc096020fced9db1f Mon Sep 17 00:00:00 2001 From: Jun Tu Date: Thu, 25 Nov 2021 10:01:32 +1100 Subject: [PATCH 1/2] fix unpickling py2 objects --- django_pylibmc/memcached.py | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/django_pylibmc/memcached.py b/django_pylibmc/memcached.py index 6257598..12bf368 100644 --- a/django_pylibmc/memcached.py +++ b/django_pylibmc/memcached.py @@ -17,6 +17,9 @@ from django.conf import settings from django.core.cache.backends.base import InvalidCacheBackendError from django.core.cache.backends.memcached import BaseMemcachedCache, DEFAULT_TIMEOUT +import sys +from pickle import load as pickle_load +from io import BytesIO try: import pylibmc @@ -47,6 +50,16 @@ 'compress_level': COMPRESS_LEVEL, } +class MemcachedClient(pylibmc.Client): + + if sys.version_info.major >= 3: + PYLIBMC_FLAG_PICKLE = 1 + + def deserialize(self, value, flags): + if flags & self.PYLIBMC_FLAG_PICKLE: + return pickle_load(BytesIO(value), encoding=u"latin1") + return super(MemcachedClient, self).deserialize(value, flags) + class PyLibMCCache(BaseMemcachedCache): @@ -75,7 +88,7 @@ def _cache(self): 'username': self._username, 'password': self._password }) - client = self._lib.Client(self._servers, **client_kwargs) + client = MemcachedClient(self._servers, **client_kwargs) if self._options: client.behaviors = self._options @@ -144,6 +157,10 @@ def get_many(self, *args, **kwargs): def set_many(self, *args, **kwargs): try: return super(PyLibMCCache, self).set_many(*args, **kwargs) + except pylibmc.ServerError: + log.error('ServerError set_many args = %s kwargs = %s' % (str(args), str(kwargs)), + exc_info=True) + return False except MemcachedError as e: log.error('MemcachedError: %s', e, exc_info=True) return False From 3d4b724331265fbf6b9a5faeaaa587b876233ad8 Mon Sep 17 00:00:00 2001 From: Danny Chen Date: Wed, 24 Apr 2024 11:57:49 +1000 Subject: [PATCH 2/2] Add support for pickle 5 protocol for upgrading python3.7 to 3.8 --- django_pylibmc/memcached.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/django_pylibmc/memcached.py b/django_pylibmc/memcached.py index 12bf368..83abbd7 100644 --- a/django_pylibmc/memcached.py +++ b/django_pylibmc/memcached.py @@ -28,6 +28,14 @@ raise InvalidCacheBackendError('Could not import pylibmc.') +if sys.version_info.major == 3 and sys.version_info.minor < 8: + # for the upgrade from python version earlier than 3.8 + try: + from pickle5 import load as pickle_load + except ImportError: + pass + + log = logging.getLogger('django.pylibmc')