2016-12-30 8 views
2

У меня есть веб-скребок, который я хочу загрузить изображение страницы, которое он соскабливает, и сохранить его как «скриншот» ImageField в модели Django. Я использую этот код:Сохранение BytesIO на Django ImageField

def save_screenshot(source,screenshot): 
    box = (0, 0, 1200, 600) 
    im = Image.open(io.BytesIO(screenshot)) 
    region = im.crop(box) 
    tempfile_io = io.BytesIO() 
    region.save(tempfile_io, 'JPEG', optimize=True, quality=70) 
    source.screenshot.save(source.slug_name+"-screenshot",ContentFile(tempfile_io.getvalue()),save=True) 

Он сохраняет скриншот к/СМИ/news_source_screenshots/директории, но не сохраняет его в модели. Поле модели определено как:

screenshot = models.ImageField(upload_to='news_source_screenshots',blank=True,null=True) 

Что мне не хватает?

+0

Я вижу, что вы сохраняете файл tempfile без данных, вы должны сохранить 'region' ... в' source.screenshot.save (source.slug_name + "- screenshot", ContentFile (region.get_value()) , save = True) ', помните, что регион os теперь ваш tempfile, потому что tempfile_io является void-буфером –

+0

спасибо @ german-alzate-martinez, но когда я попытался исправить, я получил:' code' TypeError: 'Image' не поддерживает буферный интерфейс 'code', и изображение больше не сохраняется в каталоге/media/news_source_screenshost/ –

+0

Попробуйте изменить буфер на строку io, какой регион возврата? –

ответ

0

Получается, что приведенный выше код отлично работает! Проблема в том, что я звоню вышеупомянутый метод, используя кусок кода, как это:

source = NewsSource.objects.get(name=name) 
html,screenshot = get_url(source.url) 
save_screenshot(source,screenshot) 
source.save() 

Так метод save_sceenshot работал, но тогда работа это было сделано была перезаписана моей source.save() вызова. Иди цифра!

 Смежные вопросы

  • Нет связанных вопросов^_^