U geeft de waarde door die wordt geretourneerd door het FileField
image
direct in het antwoord alsof het een string of iterable is. De broncode
controleren voor het gegeven uitzonderingspad zien we dat het object dat door het veld wordt geretourneerd de beledigende regel in zijn __iter__
heeft methode - de wrapper-klasse is op zoek naar lijnterminators. Het is zeker aannemelijk dat het onbewerkte afbeeldingsbestand bytes kan bevatten die niet kunnen worden geconverteerd naar iets dat kan worden vergeleken met de tekens van de regel terminator.
De HttpResponse
heeft gewoon iets nodig dat het als een tekenreeks kan behandelen - als je het een iterator geeft, leest het alles in één keer in en maakt het een tekenreeks, dus er is geen geheugenbesparing beschikbaar:
https://docs.djangoproject.com/en/ dev/ref/request-response/#passing-iterators
U hebt dus iets nodig dat de inhoud van uw wrapper-object voor afbeeldingsbestanden ophaalt zonder door de iteratie-interface te gaan. De lezen methode doet dat en haalt de volledige inhoud van het bestand binnen als je het geen argument geeft met een aantal bytes. Dus het eerste wat ik zou proberen is:
return HttpResponse(get_image.read(), mimetype="image/png")
Dit is niet getest, dus misschien heb ik iets over het hoofd gezien.
Je zou ook kunnen proberen om het eenvoudigere geval te profileren door je hosting-webserver de afbeeldingen te laten afhandelen en alleen een omleiding te geven naar de URL
geretourneerd uit het FileField
. Dat zou een extra HTTP-retour inhouden om de browser te vertellen waar hij moet zoeken, dus ik denk niet dat er een universele regel is voor welke aanpak sneller zal zijn.