Sie übergeben den von FileField
zurückgegebenen Wert image
direkt in die Antwort, als wäre es eine Zeichenfolge oder iterierbar. Überprüfung des Quellcode
Für den angegebenen Ausnahmepfad sehen wir, dass das vom Feld zurückgegebene Objekt die fehlerhafte Zeile in seinem __iter__
hat Methode - die Wrapper-Klasse sucht nach Zeilenabschlusszeichen. Es ist sicherlich plausibel, dass die Rohbilddatei Bytes enthalten könnte, die nicht in etwas konvertiert werden können, das mit den Zeilenabschlusszeichen verglichen werden kann.
Die HttpResponse
braucht nur etwas, das es als String behandeln kann - wenn Sie ihm einen Iterator geben, liest es alles auf einmal ein und erstellt einen String, sodass keine Speichereinsparungen verfügbar sind:
https://docs.djangoproject.com/en/ dev/ref/request-response/#passing-iterators
Sie brauchen also etwas, das den Inhalt Ihres Bilddatei-Wrapper-Objekts abruft, ohne die Iterationsschnittstelle zu durchlaufen. Die lesen -Methode tut dies und zieht den gesamten Inhalt der Datei ein, wenn Sie ihr kein Byte-Argument geben. Das erste, was ich versuchen würde, ist also:
return HttpResponse(get_image.read(), mimetype="image/png")
Dies ist ungetestet, daher habe ich möglicherweise etwas übersehen.
Sie können auch versuchen, den einfacheren Fall zu profilieren, in dem Sie Ihren Hosting-Webserver die Bilder verarbeiten lassen und nur eine Weiterleitung an URL
vom FileField
zurückgegeben . Das würde einen zusätzlichen HTTP-Roundtrip beinhalten, um dem Browser mitzuteilen, wo er suchen soll, daher glaube ich nicht, dass es eine allgemeingültige Regel dafür gibt, welcher Ansatz schneller ist.