Package: cs-django-thumbnails
Design:Uses Django Storage APIUses flexible meta data store. Supports DB and Redis backend.InstallationAddthumbnailstoINSTALLED_APPSinsettings.py.Runpython manage.py migrateto create database metadata backend.Usagesettings.py:THUMBNAILS={'METADATA':{'BACKEND':'thumbnails.backends.metadata.DatabaseBackend',},'STORAGE':{'BACKEND':'django.core.files.storage.FileSystemStorage',# You can also use Amazon S3 or any other Django storage backends},'SIZES':{'small':{'PROCESSORS':[{'PATH':'thumbnails.processors.resize','width':10,'height':10},{'PATH':'thumbnails.processors.crop','width':80,'height':80}],'POST_PROCESSORS':[{{'PATH':'thumbnails.post_processors.optimize','png_command':'optipng%(filename)s'},},],},'large':{'PROCESSORS':[{'PATH':'thumbnails.processors.resize','width':20,'height':20},{'PATH':'thumbnails.processors.flip','direction':'horizontal'}],}}}If you prefer to use Redis as your metadata storage backend (like I do :):THUMBNAILS={'METADATA':{'PREFIX':'thumbs','BACKEND':'thumbnails.backends.metadata.RedisBackend','db':2,'port':6379,'host':'localhost',},}In python:fromthumbnails.fieldsimportImageFieldclassFood(models.Model):image=ImageField()food=Food.objects.latest('id')food.image.thumbnails.all()food.image.thumbnails.small# Generates "small" sized thumbnailfood.image.thumbnails.large# Generates "large" sized thumbnailfood.image.thumbnails.small.url# Returns "small" sized thumbnail URLdjango-thumbnailscomes with a few builtin image processors:# To use the following processors, put the arguments of processors in SIZES definition
thumbnails.processors.resize(width, height)
thumbnails.processors.rotate(degrees)
thumbnails.processors.flip(direction)
thumbnails.processors.crop(width, height, center)

Processors are applied sequentially in the same order of definition.PerformanceIf you need to fetch multiple thumbnails at once, usefetchfunction for better performance.fetchuses Redis pipeline to retrieve thumbnail metadata in one go, avoiding multiple round trips to Redis.fromthumbnails.fieldimportfetch_thumbnailsfood_a=Food.objects.get(id=1)food_b=Food.objects.get(id=2)fetch_thumbnails([food_a.image,food_b.image],['small','large'])This way, when we get thumbnails likethumbnail1.size_smallor eventhumbnail1.all()we won’t query toredisanymore.
This feature is currently only available forRedisBackend.Management CommandsIf you changed your size definition and want to regenerate the thumbnails, use:python manage.py delete_thumbnails --model=app.Model --size=thumbnail_size_to_deleteRunning TestsTo run tests:`which django-admin.py` test thumbnails --settings=thumbnails.tests.settings --pythonpath=.ChangelogVersion 0.3.6Just some code cleanup nothing changed.Fixed wrong config on Readme.Version 0.3.5Dropped support for python 3.5Dropped support for Django versions: 2.0, 2.1 (it still works just dropping further development.)Version 0.3.4Removed support for python 2.Fixed project breaking if redis not installed.Fixed breaking on wrong configuration.Added support for django 3.Version 0.3.3Just made small changes to check things outVersion 0.3.2Fixed another bug infetch_thumbnails()bug. Thanks @marsha97!Version 0.3.1Fixedfetch_thumbnails()bug. Thanks @marsha97!Version 0.3.0Addedfetch_thumbnails()command to fetch multiple thumbnail metadata from Redis. Thanks @marsha97!Version 0.2.2FixedRedisBackend.get_thumbnail()bug that may cause excessive trips to Redis. Thanks @marsha97!Version 0.2.1Add support for Django 1.11, 2.0 and 2.1Version 0.2.0Improves performance on fields that have a large number of thumbnailsAdd support for Django 1.8, 1.9 and 1.10Version 0.1.3Fixes deprecation warning in Django 1.8Version 0.1.2Fixes deprecation warning in Django 1.8Version 0.1.1Useshortuuidinstead ofuuid4()to be more space efficientVersion 0.1.0First public releaseAs of February 2015, this library is suitable for production use and has been used for more than a year inStamps, an Indonesian based CRM/loyalty system.