2016-12-30 4 views
2

Ich habe eine Web Scraper, dass ich ein Bild von der Seite herunterladen will es kratzen und es als „Screenshot“ Imagefield in einem Modell Django zu speichern. Ich verwende diesen Code:Saving BytesIO zu 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) 

Es speichert den Screenshot in das Verzeichnis/media/news_source_screenshots/Verzeichnis, aber nicht, dass es auf das Modell speichern. Das Modellfeld ist definiert als:

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

Was bin ich?

+0

Ich sehe, dass Sie die temporären Dateien ohne Daten sind zu speichern, müssen Sie das 'region' speichern ... im' source.screenshot.save (source.slug_name + "- Bild", ContentFile (region.get_value()) speichern = True) ', denken Sie daran, dass die Region os jetzt Ihre tempfile, verursachen tempfile_io ist eine Lücke Puffer –

+0

dank @ Deutsch-alzate-martinez aber wenn ich Ihre Verlegenheit habe ich versucht habe:' code' Typeerror: ‚Bild‘ nicht unterstützt die Puffer-Schnittstelle 'code' und das Bild wird im Verzeichnis/media/news_source_screenshost/Verzeichnis nicht mehr gespeichert –

+0

Versuchen, den Puffer zu String io ändern, was Rückkehr Region? –

Antwort

0

So stellt sich der obige Code heraus funktioniert super! Das Problem war, dass ich das obige Verfahren rufe dies mit einem Stück Code wie:

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

So ist die save_sceenshot Methode gearbeitet, aber dann ist die Arbeit, die sie getan hatte, wurde von meinem source.save() Aufruf überschreibt. Stelle dir das vor!

Verwandte Themen