diff --git a/imagekit/cachefiles/__init__.py b/imagekit/cachefiles/__init__.py index c53a5ef..c3b50b0 100644 --- a/imagekit/cachefiles/__init__.py +++ b/imagekit/cachefiles/__init__.py @@ -45,7 +45,6 @@ class ImageCacheFile(BaseIKFile, ImageFile): def _require_file(self): before_access.send(sender=self, file=self) - return super(ImageCacheFile, self)._require_file() def generate(self, force=False): """ diff --git a/imagekit/cachefiles/backends.py b/imagekit/cachefiles/backends.py index 1c239da..50c42f4 100644 --- a/imagekit/cachefiles/backends.py +++ b/imagekit/cachefiles/backends.py @@ -101,3 +101,34 @@ class Simple(CachedFileBackend): def _exists(self, file): return bool(getattr(file, '_file', None) or file.storage.exists(file.name)) + + +def _generate_file(backend, file): + file._generate() + backend.set_state(file, CacheFileState.EXISTS) + + +try: + import celery +except ImportError: + pass +else: + _generate_file = celery.task(ignore_result=True)(_generate_file) + + +class Async(Simple): + """ + A backend that uses Celery to generate the images. + """ + + def __init__(self, *args, **kwargs): + try: + import celery + except ImportError: + raise ImproperlyConfigured('You must install celery to use' + ' imagekit.cachefiles.backend.Async.') + super(Async, self).__init__(*args, **kwargs) + + def _generate(self, file): + self.set_state(file, CacheFileState.PENDING) + _generate_file.delay(self, file) diff --git a/setup.py b/setup.py index 0affbae..2dc131f 100644 --- a/setup.py +++ b/setup.py @@ -52,6 +52,9 @@ setup( 'django-appconf>=0.5', 'pilkit', ], + extras_require={ + 'async': ['django-celery>=3.0'], + }, classifiers=[ 'Development Status :: 5 - Production/Stable', 'Environment :: Web Environment',