Django の ImageField を使って S3 に画像をアップロードしたとき自動でサムネイル画像も生成して欲しい、 さらにそのサムネイル画像の生成は非同期で行って欲しいという処理のメモ。
$ pip install django-storages easy-thumbnails django-celery boto
settings.py に以下の設定をする
AWS_ACCESS_KEY_ID = ''
AWS_SECRET_ACCESS_KEY = ''
AWS_STORAGE_BUCKET_NAME = ''
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
THUMBNAIL_DEFAULT_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
models.py はこんな感じ
from django.db import models
from easy_thumbnails.files import get_thumbnailer
class Photo(models.Model):
title = models.CharField(max_length=255)
photo = models.ImageField(upload_to='img/%Y/%m/%d')
class Meta:
ordering = ('name', )
def __unicode__(self):
return self.name
def get_photo_url(self, alias='original'):
if self.photo:
if alias == 'original':
return self.photo.url
else:
return get_thumbnailer(self.photo)[alias].url
else:
return None
# models.py
from django.dispatch import receiver
from easy_thumbnails.signals import saved_file
from myapp import tasks
@receiver(saved_file)
def generate_thumbnails_async(sender, fieldfile, **kwargs):
tasks.generate_thumbnails.delay(
model=sender, pk=fieldfile.instance.pk,
field=fieldfile.field.name)
# tasks.py
from celery import task
from easy_thumbnails.files import generate_all_aliases
@task
def generate_thumbnails(model, pk, field):
instance = model._default_manager.get(pk=pk)
fieldfile = getattr(instance, field)
generate_all_aliases(fieldfile, include_global=True)
- Easy Thumbnails — easy-thumbnails 1.4 documentation
- http://easy-thumbnails.readthedocs.org/en/latest/
- Asynchronous Pregeneration
- http://easy-thumbnails.readthedocs.org/en/latest/usage/#asynchronous-pregeneration
- Amazon S3 — django-storages 1.1.8 documentation
- http://django-storages.readthedocs.org/en/latest/backends/amazon-S3.html
- Homepage | Celery: Distributed Task Queue
- http://www.celeryproject.org/