mirror of
https://github.com/Hopiu/django-imagekit.git
synced 2026-05-09 13:54:43 +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
|
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.
|
image) as opposed to the keyword arguments we used with the generateimage tag.
|
||||||
|
|
||||||
Like with the generatethumbnail tag, you can also specify additional HTML
|
Like with the generateimage tag, you can also specify additional HTML attributes
|
||||||
attributes for the thumbnail tag, or use it as an assignment tag:
|
for the thumbnail tag, or use it as an assignment tag:
|
||||||
|
|
||||||
.. code-block:: html
|
.. code-block:: html
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@ def get_default_cachefile_backend():
|
||||||
"""
|
"""
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
return get_singleton(settings.IMAGEKIT_DEFAULT_CACHEFILE_BACKEND,
|
return get_singleton(settings.IMAGEKIT_DEFAULT_CACHEFILE_BACKEND,
|
||||||
'file backend')
|
'file backend')
|
||||||
|
|
||||||
|
|
||||||
class InvalidFileBackendError(ImproperlyConfigured):
|
class InvalidFileBackendError(ImproperlyConfigured):
|
||||||
|
|
@ -116,32 +116,78 @@ def _generate_file(backend, file, force=False):
|
||||||
backend.generate_now(file, force=force)
|
backend.generate_now(file, force=force)
|
||||||
|
|
||||||
|
|
||||||
try:
|
class BaseAsync(Simple):
|
||||||
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.
|
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):
|
def generate(self, file, force=False):
|
||||||
# Schedule the file for generation, unless we know for sure we don't
|
# 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;
|
# 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
|
# ``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
|
# schedule anything we know is unnecessary--but we also don't want to
|
||||||
# force a costly existence check.
|
# force a costly existence check.
|
||||||
if self.get_state(file, check_if_unknown=False) not in (CacheFileState.GENERATING, CacheFileState.EXISTS):
|
state = self.get_state(file, check_if_unknown=False)
|
||||||
_generate_file.delay(self, file, force=force)
|
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'
|
__title__ = 'django-imagekit'
|
||||||
__author__ = 'Justin Driscoll, Bryan Veloso, Greg Newman, Chris Drackett, Matthew Tretter, Eric Eldredge'
|
__author__ = 'Matthew Tretter, Eric Eldredge, Bryan Veloso, Greg Newman, Chris Drackett, Justin Driscoll'
|
||||||
__version__ = '3.0.4'
|
__version__ = '3.1'
|
||||||
__license__ = 'BSD'
|
__license__ = 'BSD'
|
||||||
__all__ = ['__title__', '__author__', '__version__', '__license__']
|
__all__ = ['__title__', '__author__', '__version__', '__license__']
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue