Почему корректировка img.thumbnail вызывает FileNotFoundError [Errno2] Нет такой файловой директории? - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть приложение для блога django, которое развернуто на Heroku и имеет изображения, обслуживаемые из AWS S3 Bucket.Когда пользователь пытается загрузить изображение, мы используем PIL для миниатюрного изменения размеров размеров на основе условия if (как показано в models.py ниже).

Когда я пытаюсь обновить изображение профиля, он выбрасывает ужас:

FileNotFoundError at /profile/

[Errno 2] No such file or directory: 'profile_pics/0umkn7tybif11.jpg'

В трассировке ошибки также показано, как выглядят эти ключевые строки:

 /app/users/signals.py in save_profile

        instance.profile.save()

     ...

▶ Local vars
/app/users/models.py in save

                img.save(self.image.name)

     ...

▶ Local vars
/app/.heroku/python/lib/python3.6/site-packages/PIL/Image.py in save

                    fp = builtins.open(filename, "w+b")

     ...

▶ Local vars 

Мой models.py файл, кажется, содержит код, к которому относится эта ошибка:

from django.db import models
    from django.contrib.auth.models import User 
    from PIL import Image 
    from django.core.files.storage import default_storage as storage

    class Profile(models.Model):
        user = models.OneToOneField(User, on_delete=models.CASCADE)
        image = models.ImageField(default='default.jpg', upload_to='profile_pics')

        def __str__(self):
            return f'{self.user.username} Profile'

        def save(self, **kwargs):
            super().save()

            img = Image.open(storage.open(self.image.name))

            if img.height > 300 or img.width > 300:
                output_size = (300, 300)
                img.thumbnail(output_size)
                img.save(self.image.name)

Наконец, если я удалю следующий код из файла models.py, приложениефункционирует нормально:

if img.height > 300 or img.width > 300:
    output_size = (300, 300)
    img.thumbnail(output_size)
    img.save(self.image.name)

Кажется, что img.save (self.image.name) неправильно обращается к пути корзины s3?В чем причина этого и как мне правильно реализовать эту настройку размера эскиза.

...