bitte entschuldige mich für mein hässliches englisch ;-)
Stellen Sie sich dieses sehr einfache Modell vor:
class Photo(models.Model):
image = models.ImageField('Label', upload_to='path/')
Ich möchte ein Foto aus einer Bild-URL erstellen (dh nicht von Hand auf der Django-Administrationsseite).
Ich denke, dass ich so etwas tun muss:
from myapp.models import Photo
import urllib
img_url = 'http://www.site.com/image.jpg'
img = urllib.urlopen(img_url)
# Here I need to retrieve the image (as the same way that if I put it in an input from admin site)
photo = Photo.objects.create(image=image)
Ich hoffe, dass ich das Problem gut erklärt habe, wenn nicht, sag es mir.
Danke :)
Bearbeiten:
Das mag funktionieren, aber ich weiß nicht, wie ich content
in eine Django-Datei konvertieren soll:
from urlparse import urlparse
import urllib2
from django.core.files import File
photo = Photo()
img_url = 'http://i.ytimg.com/vi/GPpN5YUNDeI/default.jpg'
name = urlparse(img_url).path.split('/')[-1]
content = urllib2.urlopen(img_url).read()
# problem: content must be an instance of File
photo.image.save(name, content, save=True)
im
Objekt?im
war etwas knapp - in diesem Beispielim
war es die Modellinstanz undfile
der einfallslose Name eines FileField / ImageField auf dieser Instanz. Die eigentlichen API-Dokumente hier sind wichtig - diese Technik sollte überall dort funktionieren, wo ein Django- Dateiobjektrequests
anstelle von könnenurllib2
Sie tun:image_content = ContentFile(requests.get(url_image).content)
und dannobj.my_image.save("foo.jpg", image_content)
.quelle
Kombinieren Sie die Aussagen von Chris Adams und Stan und aktualisieren Sie die Einstellungen für Python 3, wenn Sie sie installieren Folgendes tun Requests :
Weitere relevante Dokumente finden Sie in der ContentFile-Dokumentation von Django und im Beispiel zum Herunterladen von Anforderungsdateien .
quelle
ImageField
ist nur eine Zeichenfolge, ein Pfad relativ zu IhremMEDIA_ROOT
Einstellung. Speichern Sie einfach die Datei (möglicherweise möchten Sie PIL verwenden, um zu überprüfen, ob es sich um ein Bild handelt) und füllen Sie das Feld mit dem Dateinamen.Es unterscheidet sich von Ihrem Code darin, dass Sie die Ausgabe Ihrer
urllib.urlopen
to-Datei (innerhalb Ihres Medienspeicherorts) speichern, den Pfad erarbeiten und in Ihrem Modell speichern müssen.quelle
Ich mache das auf Python 3, das mit einfachen Anpassungen auf Python 2 funktionieren sollte. Dies basiert auf meinem Wissen, dass die Dateien, die ich abrufe, klein sind. Wenn dies bei Ihnen nicht der Fall ist, würde ich wahrscheinlich empfehlen, die Antwort in eine Datei zu schreiben, anstatt sie im Speicher zu puffern.
BytesIO wird benötigt, da Django seek () für das Dateiobjekt aufruft und urlopen-Antworten die Suche nicht unterstützen. Sie können das von read () zurückgegebene Byte-Objekt stattdessen an Djangos ContentFile übergeben.
quelle
__repr__
Methode zumFile
Schreiben des Namens. Wenn Sie möchten, können Sie dasname
Attribut für dasFile
Objekt festlegen, nachdem Sie es mit erstelltFile(io)
haben. Meiner Erfahrung nach spielt es jedoch keine Rolle (abgesehen davon, dass es beim Ausdrucken besser aussieht). ymmv.Kürzlich verwende ich den folgenden Ansatz in Python 3 und Django 3, vielleicht ist dies auch für andere interessant. Es ist ähnlich wie die Chris Adams-Lösung, aber für mich hat es nicht mehr funktioniert.
quelle
Ich habe gerade festgestellt, dass Sie keine temporäre Datei generieren müssen:
Streame URL-Inhalte direkt von Django nach Minio
Ich muss meine Dateien in Minio speichern und Django-Docker-Container ohne viel Speicherplatz haben und große Videodateien herunterladen, daher war dies für mich sehr hilfreich.
quelle
Das ist der richtige und funktionierende Weg
quelle