diff --git a/django_redis/serializers/dill.py b/django_redis/serializers/dill.py new file mode 100644 index 00000000..79effa73 --- /dev/null +++ b/django_redis/serializers/dill.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- +from __future__ import absolute_import, unicode_literals + +import dill + +from django.core.exceptions import ImproperlyConfigured + +from .base import BaseSerializer + + +class DillSerializer(BaseSerializer): + def __init__(self, options): + self._pickle_version = -1 + self.setup_pickle_version(options) + + def setup_pickle_version(self, options): + if "PICKLE_VERSION" in options: + try: + self._pickle_version = int(options["PICKLE_VERSION"]) + except (ValueError, TypeError): + raise ImproperlyConfigured("PICKLE_VERSION value must be an integer") + + def dumps(self, value): + return dill.dumps(value, self._pickle_version) + + def loads(self, value): + return dill.loads(value) diff --git a/requirements.txt b/requirements.txt index fc3017e7..7adac0b8 100644 --- a/requirements.txt +++ b/requirements.txt @@ -6,3 +6,4 @@ msgpack-python>=0.4.6 redis>=2.10.0 wheel lz4>=0.15 +dill diff --git a/tests/runtests-dill.py b/tests/runtests-dill.py new file mode 100755 index 00000000..20593a2e --- /dev/null +++ b/tests/runtests-dill.py @@ -0,0 +1,13 @@ +# -*- coding: utf-8 -*- + +import os +import sys + +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "test_sqlite_dill") + +if __name__ == "__main__": + from django.core.management import execute_from_command_line + args = sys.argv + args.insert(1, "test") + execute_from_command_line(args) diff --git a/tests/test_sqlite_dill.py b/tests/test_sqlite_dill.py new file mode 100644 index 00000000..26232f73 --- /dev/null +++ b/tests/test_sqlite_dill.py @@ -0,0 +1,44 @@ +SECRET_KEY = "django_tests_secret_key" + +CACHES = { + "default": { + "BACKEND": "django_redis.cache.RedisCache", + "LOCATION": [ + "redis://127.0.0.1:6379?db=1", + "redis://127.0.0.1:6379?db=1", + ], + "OPTIONS": { + "CLIENT_CLASS": "django_redis.client.DefaultClient", + "SERIALIZER": "django_redis.serializers.dill.DillSerializer", + } + }, + "doesnotexist": { + "BACKEND": "django_redis.cache.RedisCache", + "LOCATION": "127.0.0.1:56379:1", + "OPTIONS": { + "CLIENT_CLASS": "django_redis.client.DefaultClient", + "SERIALIZER": "django_redis.serializers.dill.DillSerializer", + } + }, + "sample": { + "BACKEND": "django_redis.cache.RedisCache", + "LOCATION": "127.0.0.1:6379:1,127.0.0.1:6379:1", + "OPTIONS": { + "CLIENT_CLASS": "django_redis.client.DefaultClient", + "SERIALIZER": "django_redis.serializers.dill.DillSerializer", + } + }, + "with_prefix": { + "BACKEND": "django_redis.cache.RedisCache", + "LOCATION": "redis://127.0.0.1:6379?db=1", + "OPTIONS": { + "CLIENT_CLASS": "django_redis.client.DefaultClient", + "SERIALIZER": "django_redis.serializers.dill.DillSerializer", + }, + "KEY_PREFIX": "test-prefix", + }, +} + +INSTALLED_APPS = ( + "django.contrib.sessions", +)