Проблема с каталогом / файлами мультимедиа на pythonanywhere - PullRequest
0 голосов
/ 26 марта 2020

У меня возникла проблема с отображением медиа-контента на моем веб-сайте. Все отлично работает при запуске на localhost. Однако при развертывании в python где-либо я получаю FileNotFoundError , когда я пытаюсь загрузить изображение через форму. Я просмотрел переполнение некоторых смежных тем, но не нашел ни одной темы, которая позволила бы мне решить мою проблему.

Вот точная ошибка, полученная при отправке формы загрузки изображения:

pythonanywhere error message stack trace of error Кажется, проблема с методом resize в models.py (который отлично работает на localhost)

Вот соответствующие установочные файлы: settings.py

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
...
MEDIA_DIR = os.path.join(BASE_DIR, 'media')
# Media
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
IMAGES_DIR = os.path.join(MEDIA_URL,"images")

python anywhere static files setup

Я полагаю, что ошибка связана с тем, что метод images_path не перенастраивает правильное местоположение (но он работает на локальном хосте). Вот модель, которая хранит изображение и определяет, как изображения сохраняются: models.py

class Image(models.Model):

    # this might work?
    def images_path():
        return os.path.join(settings.IMAGES_DIR, 'usruploads')

    def resize(self):
        im = PIL.Image.open(self.image)
        size=(200,200)
        out = im.resize(size)
        out.save(self.image.__str__())

    def save(self, *args, **kwargs):
        super(Image, self).save(*args, **kwargs)
        self.resize()

    image      = models.ImageField(upload_to=images_path()[1:], max_length=255)

Я также добавлю структуру каталогов мультимедиа сайта на случай, если эта информация будет полезна.

media directory 1 media directory 2

Это моя первая попытка развертывания веб-приложения Django с помощью python в любом месте, надеюсь, когда-то проблема исправлена, это ошибка, которую я больше никогда не сделаю.

Я реализовал предложенное вами изменение, и указанный URL-адрес существует, и теперь это начало, однако сервер заявляет, что это не так. Я распечатал URL и путь к изображению следующим образом: image paths Я могу go перейти на страницу индекса и ввести этот URL, и он загрузит изображение. Хорошо, ваше предложение было правильным, пока путь вместо __str __ () работал. Причина, по которой возникла вторая проблема, была связана с тем, что я открывал изображение с помощью url и пытался сохранить его с помощью path , это не понравилось. Спасибо за вашу помощь!

1 Ответ

1 голос
/ 26 марта 2020

Учитывая

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
IMAGES_DIR = os.path.join(MEDIA_URL,"images")

и

class Image(models.Model):

    # this might work?
    def images_path():
        return os.path.join(settings.IMAGES_DIR, 'usruploads')

    def resize(self):
        im = PIL.Image.open(self.image)
        size=(200,200)
        out = im.resize(size)
        out.save(self.image.__str__())

    def save(self, *args, **kwargs):
        super(Image, self).save(*args, **kwargs)
        self.resize()

    image = models.ImageField(upload_to=images_path()[1:], max_length=255)

Мы можем сделать вывод, что

IMAGES_DIR = "/media/images"

и

image = models.ImageField(upload_to='media/images/usruploads', max_length=255)

Это означает, что файлы загружено в /<base_dir>/media/media/images/usruploads.

выпуск

При просмотре ваших журналов ошибка возникает в конце ваших журналов.

    ...
    out.save(self.image.__str__())

Проблема в том, что self.image.__str__() возвращает относительный путь / имя файла файла, и когда вы передаете относительный путь к out.save, он попытается сохранить этот файл в указанном пути ОТНОСИТЕЛЬНО К ТЕКУЩИЙ РАБОЧИЙ СПРАВОЧНИК.

Решение

Вместо этого (если вы хотите заменить исходное изображение) вам нужно передать абсолютный путь к исходному изображению:

    ...
    out.save(self.image.path)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...