Skip to content

Instantly share code, notes, and snippets.

@voluntas
Last active May 13, 2022 13:46
Show Gist options
  • Save voluntas/7002085 to your computer and use it in GitHub Desktop.
Save voluntas/7002085 to your computer and use it in GitHub Desktop.
S3 と非同期サムネイル作成 コトハジメ

django-storages + easy-thumbnails + django-celery コトハジメ(仮)

更新:2013-10-16
バージョン:0.0.0
作者:@voluntas
URL:http://voluntas.github.io/

概要

Django の ImageField を使って S3 に画像をアップロードしたとき自動でサムネイル画像も生成して欲しい、 さらにそのサムネイル画像の生成は非同期で行って欲しいという処理が必要になったので、どうやって実現するべきなのかをまとめたメモ。

セットアップ

インストール:

$ pip install django-storages easy-thumbnails django-celery boto
  • celery のキューには Redis を使用する
  • django-storages は S3 を使用する

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 django.dispatch import receiver

from easy_thumbnails.signals import saved_file
from easy_thumbnails.files import get_thumbnailer

from .tasks import generate_thumbnails

class Photo(models.Model):
    title = models.CharField(max_length=255)
    photo = models.ImageField(upload_to='img/%Y/%m/%d')

    class Meta:
        ordering = ('title', )

    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

@receiver(saved_file)
def generate_thumbnails_async(sender, fieldfile, **kwargs):
    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)

urls.py

views.py

forms.py

参照

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/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment