Изменение размера миниатюр django Heroku, «бэкенд не поддерживает абсолютные пути»

У меня есть приложение, развернутое на Heroku с использованием Django, и пока оно работает, но у меня проблема с загрузкой новых эскизов. Я установил Pillow, чтобы позволить мне изменять размер изображений при их загрузке и сохранять миниатюру измененного размера, а не исходное изображение. Однако каждый раз при загрузке я получаю следующую ошибку: «Этот сервер не поддерживает абсолютные пути». Когда я перезагружаю страницу, новое изображение появляется, но его размер не изменяется. Я использую Amazon AWS для хранения изображений.

Я подозреваю, что это как-то связано с моим models.py. Вот мой код изменения размера:

class Projects(models.Model):
    project_thumbnail = models.FileField(upload_to=get_upload_file_name, null=True, blank=True)

    def __unicode__(self):
        return self.project_name

    def save(self):
        if not self.id and not self.project_description:
            return

        super(Projects, self).save()
        if self.project_thumbnail:
            image = Image.open(self.project_thumbnail)
            (width, height) = image.size

        image.thumbnail((200,200), Image.ANTIALIAS)
            image.save(self.project_thumbnail.path)

Есть что-то, чего мне не хватает? Нужно ли мне говорить ему что-то еще?


person Jason B    schedule 13.08.2013    source источник


Ответы (2)


При работе с Heroku и AWS вам просто нужно изменить метод «путь» FileField/ImageField на «имя». Итак, в вашем случае это будет:

image.save(self.project_thumbnail.name)

вместо

image.save(self.project_thumbnail.path)
person Vladimir    schedule 15.04.2016

Я нашел ответ с помощью других пользователей Google, так как мои поиски не дали ответов, которые я хотел. Это была проблема с Pillow и с тем, как он использует абсолютные пути для сохранения, поэтому я переключился на использование модуля storages в качестве временного пространства для сохранения, и теперь он работает. Вот код:

from django.core.files.storage import default_storage as storage

...

   def save(self):
        if not self.id and not self.project_description:
            return

        super(Projects, self).save()
        if self.project_thumbnail:
            size = 200, 200
            image = Image.open(self.project_thumbnail)
            image.thumbnail(size, Image.ANTIALIAS)
            fh = storage.open(self.project_thumbnail.name, "w")
            format = 'png'  # You need to set the correct image format here
            image.save(fh, format)
            fh.close()
person Jason B    schedule 15.08.2013