mirror of
https://github.com/Hopiu/django-imagekit.git
synced 2026-03-17 05:40:25 +00:00
Merge branch 'release/3.1'
* release/3.1: Tagging 3.1. Correct reference to generateimage tag Fix celery backend Cache file backends: dropped the "Async" in class names Added RQ-based async cache file backend
This commit is contained in:
commit
a14fc91c8d
3 changed files with 72 additions and 26 deletions
|
|
@ -277,8 +277,8 @@ with the id "imagekit:thumbnail" which, by default, is
|
|||
Second, we're passing two positional arguments (the dimensions and the source
|
||||
image) as opposed to the keyword arguments we used with the generateimage tag.
|
||||
|
||||
Like with the generatethumbnail tag, you can also specify additional HTML
|
||||
attributes for the thumbnail tag, or use it as an assignment tag:
|
||||
Like with the generateimage tag, you can also specify additional HTML attributes
|
||||
for the thumbnail tag, or use it as an assignment tag:
|
||||
|
||||
.. code-block:: html
|
||||
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@ def get_default_cachefile_backend():
|
|||
"""
|
||||
from django.conf import settings
|
||||
return get_singleton(settings.IMAGEKIT_DEFAULT_CACHEFILE_BACKEND,
|
||||
'file backend')
|
||||
'file backend')
|
||||
|
||||
|
||||
class InvalidFileBackendError(ImproperlyConfigured):
|
||||
|
|
@ -116,32 +116,78 @@ def _generate_file(backend, file, force=False):
|
|||
backend.generate_now(file, force=force)
|
||||
|
||||
|
||||
try:
|
||||
import celery
|
||||
except ImportError:
|
||||
pass
|
||||
else:
|
||||
_generate_file = celery.task(ignore_result=True)(_generate_file)
|
||||
|
||||
|
||||
class Async(Simple):
|
||||
class BaseAsync(Simple):
|
||||
"""
|
||||
A backend that uses Celery to generate the images.
|
||||
Base class for cache file backends that generate files asynchronously.
|
||||
"""
|
||||
|
||||
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, force=False):
|
||||
# Schedule the file for generation, unless we know for sure we don't
|
||||
# need to. If an already-generated file sneaks through, that's okay;
|
||||
# ``generate_now`` will catch it. We just want to make sure we don't
|
||||
# schedule anything we know is unnecessary--but we also don't want to
|
||||
# force a costly existence check.
|
||||
if self.get_state(file, check_if_unknown=False) not in (CacheFileState.GENERATING, CacheFileState.EXISTS):
|
||||
_generate_file.delay(self, file, force=force)
|
||||
state = self.get_state(file, check_if_unknown=False)
|
||||
if state not in (CacheFileState.GENERATING, CacheFileState.EXISTS):
|
||||
self.schedule_generation(file, force=force)
|
||||
|
||||
def schedule_generation(self, file, force=False):
|
||||
# overwrite this to have the file generated in the background,
|
||||
# e. g. in a worker queue.
|
||||
raise NotImplementedError
|
||||
|
||||
|
||||
try:
|
||||
from celery import task
|
||||
except ImportError:
|
||||
pass
|
||||
else:
|
||||
_celery_task = task(ignore_result=True)(_generate_file)
|
||||
|
||||
|
||||
class Celery(BaseAsync):
|
||||
"""
|
||||
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.backends.Celery.')
|
||||
super(Celery, self).__init__(*args, **kwargs)
|
||||
|
||||
def schedule_generation(self, file, force=False):
|
||||
_celery_task.delay(self, file, force=force)
|
||||
|
||||
|
||||
Async = Celery # backwards compatibility
|
||||
|
||||
|
||||
try:
|
||||
import django_rq
|
||||
except ImportError:
|
||||
pass
|
||||
|
||||
|
||||
class RQ(BaseAsync):
|
||||
"""
|
||||
A backend that uses RQ to generate the images.
|
||||
"""
|
||||
queue_name = 'default'
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
try:
|
||||
import django_rq
|
||||
except ImportError:
|
||||
raise ImproperlyConfigured('You must install django_rq to use'
|
||||
' imagekit.cachefiles.backends.RQ.')
|
||||
super(RQ, self).__init__(*args, **kwargs)
|
||||
|
||||
def get_queue(self):
|
||||
# not caching property to avoid "can't pickle instancemethod objects",
|
||||
# see https://github.com/nvie/rq/issues/189
|
||||
return django_rq.get_queue(self.queue_name)
|
||||
|
||||
def schedule_generation(self, file, force=False):
|
||||
self.get_queue().enqueue(_generate_file, args=(self, file),
|
||||
kwargs=dict(force=force), result_ttl=0)
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
__title__ = 'django-imagekit'
|
||||
__author__ = 'Justin Driscoll, Bryan Veloso, Greg Newman, Chris Drackett, Matthew Tretter, Eric Eldredge'
|
||||
__version__ = '3.0.4'
|
||||
__author__ = 'Matthew Tretter, Eric Eldredge, Bryan Veloso, Greg Newman, Chris Drackett, Justin Driscoll'
|
||||
__version__ = '3.1'
|
||||
__license__ = 'BSD'
|
||||
__all__ = ['__title__', '__author__', '__version__', '__license__']
|
||||
|
|
|
|||
Loading…
Reference in a new issue