Измените размер изображения из формы модели Django перед его загрузкой в ​​корзину amazon s3.

Я пытаюсь изменить размер изображения, прежде чем загружать его в корзину S3, используя PIL.
Форма модели работает отлично, за исключением того, что изменение размера изображения не происходит.

Ниже приведены мои модели:

class ImageDetail(models.Model):

    def upload_image(self, filename):
        return u'obj/{name}.{ext}'.format(            
            name = uuid.uuid4().hex,
            ext  = os.path.splitext(filename)[1].strip('.')
        )
    flag = models.IntegerField(default=0)
    view = models.IntegerField(default=0)
    title = models.CharField(max_length=500, help_text="Enter a small/suitable title")
    image = models.ImageField(upload_to = upload_image, 
                          help_text="Please ensure, image size is less than 1 MB")

Файл представлений выглядит так:

form = ImageUploadForm(request.POST or None, request.FILES or None)
if form.is_valid() and request.POST:
    form_instance = form.save(commit=False)
    img = form_instance.image
    # process the image now
    if img.width > 300 or img.height > 200:
        IMG_TYPE = os.path.splitext(img.name)[1].strip('.').lower()
        if IMG_TYPE == 'jpeg':
            PIL_TYPE = 'jpeg'
            FILE_EXTENSION = 'jpeg'
        elif IMG_TYPE == 'jpg':
            PIL_TYPE = 'jpeg'
            FILE_EXTENSION = 'jpeg'
        elif IMG_TYPE == 'png':
            PIL_TYPE = 'png'
            FILE_EXTENSION = 'png'
        elif IMG_TYPE == 'gif':
            PIL_TYPE = 'gif'
            FILE_EXTENSION = 'gif'
        else:
            print 'Not a valid format'
            return
        im = Image.open(StringIO(img.read()))
        im.thumbnail((300, 180), Image.ANTIALIAS)
        #Save the image
        temp_handle = StringIO()
        im.save(temp_handle, PIL_TYPE)
        s3 = S3Custom()
        if not form_instance.image:
            return self.success(self.request, form, None, errors = 'Error while uploading the image')
        form_instance.save()

Пользовательская функция S3 определяется следующим образом:

class S3Custom(object):
    conn = S3Connection(settings.AWS_ACCESS_KEY_ID, settings.AWS_SECRET_ACCESS_KEY)
    b = Bucket(conn, settings.AWS_STORAGE_BUCKET_NAME)
    k = Key(b)
    def upload_file(self, ruta, prefix):
        try:           
            self.k.key = '%s/%s' % (prefix, os.path.split(ruta)[-1])
            self.k.set_contents_from_filename(ruta)
            self.k.make_public()
        except Exception, e:
            print e
        return '%s%s' % (settings.S3_URL, self.k.key)

Я установил django-storage. Проблема в том, что изображение загружается довольно хорошо, но его размер не изменяется должным образом. Что мне не хватает? Я ошибаюсь с

im.save(temp_handle, PIL_TYPE)
s3 = S3Custom()
form_instance.save()         

в файле представлений? Пожалуйста дайте мне знать, спасибо!


person whatf    schedule 06.02.2013    source источник


Ответы (1)


Итак, обо всем по порядку: вы почти наверняка не хотите изменять размер синхронно — вместо этого запустите задачу Celery (или аналогичную), чтобы выполнить изменение размера асинхронно после того, как вы сохранили оригинал.

Кроме того, вы никогда ничего не делаете с объектом s3 - s3.upload_file мало что сделает, если он никогда не вызывается...

(Также рекомендую использовать какой-нибудь статический анализатор, который предупредит вас о неиспользуемых переменных!)

person Kristian Glass    schedule 08.02.2013
comment
спасибо за ваш ответ, проблема, которую я не могу понять, заключается в том, как изображение загружается на машину AWS. - person whatf; 08.02.2013
comment
Подозреваю, что вы делаете что-то еще с django-storages, но вам нужно увидеть больше кода (например, ImageUploadForm...) - person Kristian Glass; 10.02.2013