Файл сохранения Django

#django #django-models #thumbnails

#django #django-модели #эскизы

Вопрос:

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

Моя модель выглядит следующим образом:

 from image_tools import resize

class Photo(models.Model):
    # some fields
    image = models.ImageField(
                upload_to='images',
                height_field='height',
                width_field='width'
            )
    thumb = models.ImageField(
        upload_to='thumbs',
        editable=False
    )

    def save(self):
        self.thumb = self.image
        resize(self.image.path, self.thumb.path, 50, 40)
        super(Photo, self).save()
  

Вот resize() написанная мной простая функция, которая принимает в качестве аргументов исходный путь к файлу, путь назначения и размеры и сохраняет миниатюру. Единственная проблема заключается в том, что на данный момент файла еще нет на диске.

Есть ли способ принудительно сохранить сам файл в его местоположении, чтобы он был доступен моей функции?

Пожалуйста, не стесняйтесь предлагать лучшие способы решения этого вопроса. Тем не менее, я хотел бы знать, как обрабатывать файлы, которые еще не сохранены, каким бы ни оказалось лучшее решение.

Ответ №1:

Есть несколько способов сделать это. Если у вас есть необработанные данные изображения, вы можете довольно легко записать их в файл (посмотрите раздел Загрузка файла django, чтобы узнать, как сохранить загруженный файл на диск). Вы можете прочитать любой файл, к которому имеет доступ ваш процесс django (или apache), а не только путь к вашему экземпляру django.

Еще одна вещь, которую вы можете сделать перед сохранением этого, — использовать PIL для создания миниатюр изображения и сохранения его:
http://effbot.org/imagingbook/image.htm

Вы также можете загрузить данные в s3 с помощью boto s3, если хотите, чтобы изображения размещались на CDN.

Комментарии:

1. Я прочитал загрузку файла django, и я не нашел ответа на свой вопрос. Не могли бы вы выразиться немного конкретнее? «Как только у вас будут необработанные данные изображения, вы можете довольно легко записать их в файл» — это именно то, о чем я спрашиваю, как это сделать.

Ответ №2:

Сохранение файла напрямую не является хорошей идеей, потому что вы игнорируете файловое хранилище по умолчанию (т. Е. файловую систему, amazon s3, …)

Лучший подход — использовать класс файла django

 from django.core.files import File
# Create a Python file object using open() and the with statement
>>> with open('/tmp/hello.world', 'w') as f:
...     myfile = File(f)
...     myfile.write('Hello World')
  

Также для удаления файла используйте класс хранилища по умолчанию
Смотрите ссылку ниже для получения более подробной информации
https://docs.djangoproject.com/en/1.5/topics/files /