2013-02-04 5 views
5

Al fine di ridimensionare le immagini dopo il caricamento (usando PIL), sto override del metodo di salvataggio per il mio articolo il modello in questo modo:Django - Ottenere Immagine PIL Salva metodo per lavorare con i bagagli Amazon s3boto

def save(self): 
    super(Article, self).save() 
    if self.image: 
     size = (160, 160) 
     image = Image.open(self.image) 
     image.thumbnail(size, Image.ANTIALIAS) 
     image.save(self.image.path) 

Questo funziona localmente ma in produzione ottengo un errore: NotImplementedError: questo backend non supporta i percorsi assoluti.

ho provato a sostituire la linea image.save con

image.save(self.image.url) 

ma tanto sono un IOError: [Errno 2] Nessun file o directory: 'https://my_bucket_name.s3.amazonaws.com/article/article_images/2.jpg'

Questa è la posizione corretta dell'immagine però. Se metto quell'indirizzo nel browser, l'immagine è lì. Ho provato un certo numero di altre cose ma finora, senza fortuna.

+0

È la prima volta in esecuzione il vostro sito da qualche parte altro oltre alla tua macchina locale? – Dave

+0

Sì. È. Perché? – KrisF

risposta

7

Si dovrebbe cercare di evitare il salvataggio su percorsi assoluti; c'è un File Storage API che astrae questo tipo di operazioni per te.

Guardando lo PIL Documentation, sembra che la funzione save() supporti il ​​passaggio di un oggetto simile a un file anziché di un percorso.

Non sono in un ambiente in cui posso provare questo codice, ma credo che si avrebbe bisogno di fare qualcosa di simile al posto del tuo ultima riga:

from django.core.files.storage import default_storage as storage 

fh = storage.open(self.image.name, "w") 
format = 'png' # You need to set the correct image format here 
image.save(fh, format) 
fh.close() 
+0

Provato. Got a AttributeError: L'oggetto 'NoneType' non ha attributo 'write'. Sembra fh = Nessuno – KrisF

+1

Ho funzionato cambiando la prima riga. Ho provato a modificare la risposta con l'intento di accettarla dopo l'approvazione della modifica, ma la modifica è stata rifiutata. Non so perché. Ecco cosa ho aggiunto/modificato per farlo funzionare: da django.core.files.storage import default_storage come storage fh = storage.open (self.image.name, "w") – KrisF

+0

@krisF grazie aggiornato la mia risposta :) – minism