diff --git a/django_celery_results/backends/cache.py b/django_celery_results/backends/cache.py index 43c3745a..a40e1b41 100644 --- a/django_celery_results/backends/cache.py +++ b/django_celery_results/backends/cache.py @@ -3,6 +3,7 @@ from celery.backends.base import KeyValueStoreBackend from django.core.cache import cache as default_cache from django.core.cache import caches +from kombu.utils.encoding import bytes_to_str class CacheBackend(KeyValueStoreBackend): @@ -15,12 +16,15 @@ def __init__(self, *args, **kwargs): self.serializer = 'pickle' def get(self, key): + key = bytes_to_str(key) return self.cache_backend.get(key) def set(self, key, value): + key = bytes_to_str(key) self.cache_backend.set(key, value, self.expires) def delete(self, key): + key = bytes_to_str(key) self.cache_backend.delete(key) def encode(self, data): diff --git a/t/unit/backends/test_cache.py b/t/unit/backends/test_cache.py index 346ea971..1cc70401 100644 --- a/t/unit/backends/test_cache.py +++ b/t/unit/backends/test_cache.py @@ -4,6 +4,7 @@ import pytest from billiard.einfo import ExceptionInfo from celery import result, states, uuid +from kombu.utils.encoding import bytes_to_str from django_celery_results.backends.cache import CacheBackend @@ -59,6 +60,18 @@ def test_is_pickled(self): assert rindb.get('foo') == 'baz' assert rindb.get('bar').data == 12345 + def test_convert_key_from_byte_to_str(self): + """ Tests that key in byte form passed into cache + are succesfully completed """ + tid = bytes_to_str(uuid()) + + assert self.b.get_status(tid) == states.PENDING + assert self.b.get_result(tid) is None + + self.b.mark_as_done(tid, 42) + assert self.b.get_status(tid) == states.SUCCESS + assert self.b.get_result(tid) == 42 + def test_mark_as_failure(self): einfo = None tid3 = uuid()