Для чего используется StringIO () в этом скрипте? - PullRequest
1 голос
/ 14 декабря 2011

Я только начал использовать Django и Python и пытаюсь создать приложение для фотографий. Этот скрипт генерирует миниатюры, и я бы хотел сделать это сам. К сожалению, я не понимаю, что делает StringIO(). Документы Python не очень помогают мне в этом случае.

Может кто-нибудь объяснить мне, что StringIO() делает в этом конкретном случае?

С http://djangosnippets.org/snippets/1172/:

def save(self):
    from PIL import Image
    #Original photo
    imgFile = Image.open(self.image.path)

    #Convert to RGB
    if imgFile.mode not in ('L', 'RGB'):
        imgFile = imgFile.convert('RGB')

    #Save a thumbnail for each of the given dimensions
    #The IMAGE_SIZES looks like:
    #IMAGE_SIZES = { 'image_web'      : (300, 348),
    #                'image_large'    : (600, 450),
    #                'image_thumb'    : (200, 200) }
    #each of which corresponds to an ImageField of the same name
    for field_name, size in self.IMAGE_SIZES.iteritems():
        field = getattr(self, field_name)
        working = imgFile.copy()
        working.thumbnail(size, Image.ANTIALIAS)
        fp = StringIO()
        working.save(fp, "JPEG", quality=95)
        cf = ContentFile(fp.getvalue())
        field.save(name=self.image.name, content=cf, save=False);

    #Save instance of Photo
    super(Photo, self).save()

Ответы [ 2 ]

2 голосов
/ 14 декабря 2011

StringIO - это класс, который можно использовать как объект типа файла.Вы можете использовать его точно так же, как и обычный файл, за исключением того, что вместо данных, записываемых на диск, он будет записан в буфер (строковый буфер) в памяти.

В этом сценарии он выглядит какИзображение сначала сохраняется в буфере памяти StringIO, а затем значение строки извлекается и передается в конструктор для ContentFile для создания нового экземпляра ContentFile, который затем передается в функцию сохранения поля.

Я бы предположил, что причина, по которой скрипт использует StringIO, заключается в том, что конструктор для ContentFile принимает строку, а запись в и затем чтение файла StringIO - самый простой способ получить содержимое изображения, представленное в виде строки.

В качестве дополнительного примечания я хотел бы предложить вам взглянуть на тип поля Django ImageFile , его более чем достаточно для моих потребностей, связанных с изображениями, и он более понятен, чем прохождение через StringIO и ContentFiles.

0 голосов
/ 14 декабря 2011

StringIO обеспечивает возможность чтения и записи в строку, как если бы вы записывали в файл. Это может сделать кодирование более удобным, простым или и тем, и другим.

Также позволяет редактировать строки, в отличие от обычных строк Python.

...