A simple, S3-backed thumbnailer field.
Project description
django-athumb
- Author:
Greg Taylor
- License:
BSD
Storing images and their thumbnails on S3 is a bit of a clumbsy endeavor with Django. While this Django app may work with more typical storage backends, it is intended to accept image uploads, thumbnail them, and upload the original plus the thumbs to S3. You may then get to the thumbnails in your template by doing something like:
<img src="{% thumbnail some_obj.image '80x80' %}" />
This automatically assembles the remote S3 URL to retrieve the thumbnail from. No error checking is done, and several assumptions are made for the sake of speed.
Advantages of django-athumb
The primary advantage of django-athumb is that, unlike sorl and others, thumbnails are generated at the time of user uploading the original image. Instead of generating thumbs on-demand, or needing a caching layer, we generate pre-defined thumbnails at time of upload. This leads to a few big benefits:
We never check for the existence of a file, after the first save/upload. We assume it exists, skipping the need to hit caches or the disk. This makes us faster and more simple than some of the other alternatives.
Since we define every possible thumbnail in advance via models.py, we have a defined set of possible values. Thumbnails sizes can also be named anything, whether it be ‘60x60_cropped’ or ‘medium_nocrop’.
Disadvantages of django-athumb
This wouldn’t be a fair assessment without some of these:
Some may prefer to define thumbnail sizes in templates. This is largely preference.
We only support simple scaling/cropping/centering as thumbnail operations. sorl and others are going to give you a whole lot more gadgets out of the box.
License
All code is under a BSD-style license, see LICENSE for details.
Requirements
python >= 2.7
django >= 1.6
boto >= 3.0
Pillow >= 2.5.0
Installation
To install run:
pip install django-athumb
or:
easy_install django-athumb
Configuration
settings.py
Add to INSTALLED_APPS:
'athumb'
Add to TEMPLATE_CONTEXT_PROCESSORS in settings.py:
'django.core.context_processors.request'
If you want S3 storage as your default file back-end:
# If you don't want this to be the global default, just make sure you # specify the S3BotoStorage_AllPublic backend on a per-field basis. DEFAULT_FILE_STORAGE = 'athumb.backends.s3boto.S3BotoStorage_AllPublic'
Then setup some values used by the backend:
AWS_ACCESS_KEY_ID = 'YourS3AccessKeyHere' AWS_SECRET_ACCESS_KEY = 'YourS3SecretAccessKeyHere' AWS_STORAGE_BUCKET_NAME = 'OneOfYourBuckets'
If you would like to use a vanity domain instead of s3.amazonaws.com, you first should configure it in amazon and then add this to settings:
AWS_STORAGE_BUCKET_CNAME = 'static.yourdomain.com'
If you want a cache buster for your thumbnails (a string added to the end of the image URL that causes browsers to re-fetch the image after changes), you can set a value like this:
MEDIA_CACHE_BUSTER = 'SomeValue'
You do not need to specify a cache buster.
If you aren’t using the default S3 region, you can define it with the following setting:
AWS_REGION = 'us-east-1'
Using in models
After you have all of the above configured, you’re ready to start using athumb in your models. Here is an example model with a thumbnailing field.
from django.db import models from athumb.fields import ImageWithThumbsField from athumb.backends.s3boto import S3BotoStorage_AllPublic # It is generally good to keep these stored in their own module, to allow # for other models.py modules to import the values. This assumes that more # than one model stores stuff in the same bucket. PUBLIC_MEDIA_BUCKET = S3BotoStorage_AllPublic(bucket='public-media') class YourModel(models.Model) image = ImageWithThumbsField( upload_to="store/product_images", thumbs=( ('50x50_cropped', {'size': (50, 50), 'crop': True}), ('60x60', {'size': (60, 60)}), ('80x1000', {'size': (80, 1000)}), ('front_page', {'size': (120, 1000)}), ('medium', {'size': (161, 1000)}), ('large', {'size': (200, 1000)}), ), blank=True, null=True, storage=PUBLIC_MEDIA_BUCKET)
A few things to note:
The tuples in thumbs are in the format of (name, options). The value for name can be whatever string you’d like. Notice that you can make the names dimensions, or something entirely different.
The storage keyword is important, used for specifying the bucket for the field. If you don’t specify storage, the default backend is used. As a shortcut, you could set S3BotoStorage_AllPublic as your default backend, and the AWS_* values would determine the default bucket.
Backends
django-athumb comes with a simplified s3boto backend, modified from those found in the django-storages project. For most cases, you’ll want to use athumb.backends.s3boto.S3BotoStorage_AllPublic, as it does not use HTTPS, and is a good bit faster than S3BotoStorage because it makes some assumptions.
manage.py commands
athumb_regen_field
# ./manage.py athumb_regen_field <app.model> <field>
Re-generates thumbnails for all instances of the given model, for the given field.
To-Do
See the issue tracker for a list of outstanding things needing doing.
Change Log
2.4.1
Fixes to restore compatibility with migrations. (jneves)
2.4
Changes to add Django 1.7 compatibility.
2.3
Embed pial, eliminating the need to install it separately.
2.2
Added support for different S3 regions via the AWS_REGION setting.
Improved error handling.
2.1
Make MEDIA_CACHE_BUSTER optional.
Documented MEDIA_CACHE_BUSTER.
2.0
Complete re-work of the way thumbnails are specified in models.py.
Removal of the attribute-based image field size retrieval, since we no longer are just limited to dimensions.
Further misc. improvements.
1.0
Initial release.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
File details
Details for the file django-athumb-2.4.1.tar.gz
.
File metadata
- Download URL: django-athumb-2.4.1.tar.gz
- Upload date:
- Size: 21.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | ef31c9ffa162716ee2cd127ce8271d1652bf77b4a62538ba695505763ae28969 |
|
MD5 | aeb1f4f8778c6e9198fa7c9c8f172710 |
|
BLAKE2b-256 | 89e9efc5b6f5b497e3633d2f7044b428ca9a7f9babb1009271055dfe58be91eb |