Du skickar värdet som returneras av FileField
image
direkt in i svaret som om det vore en sträng eller iterabel. Kontrollerar källkoden
för den angivna undantagssökvägen ser vi att objektet som returneras av fältet har den felande raden i sin __iter__
metod - wrapperklassen letar efter linjeavslutare. Det är förvisso troligt att den råa bildfilen kan innehålla byte som inte kan konverteras till något som kan jämföras med linjeavslutningstecken.
HttpResponse
behöver bara något den kan behandla som en sträng - om du ger den en iterator läser den in allt på en gång och skapar en sträng, så det finns inga minnesbesparingar tillgängliga:
https://docs.djangoproject.com/en/ dev/ref/request-response/#passing-iterators
Så du behöver något som drar innehållet i ditt bildfilsomslagsobjekt utan att gå igenom iterationsgränssnittet. läs metoden gör det, drar in hela filens innehåll om du inte ger den ett antal byte-argument. Därför är det första jag skulle försöka:
return HttpResponse(get_image.read(), mimetype="image/png")
Det här är oprövat, så jag kanske har förbisett något.
Du kan också försöka profilera det enklare fallet att låta din värdwebbserver hantera bilderna och bara skicka en omdirigering till URL
returneras från FileField
. Det skulle innebära en extra HTTP-tur och retur för att tala om för webbläsaren var den ska leta, så jag tror inte att det finns en universell regel för vilket tillvägagångssätt som är snabbare.