Du sender den værdi, der returneres af FileField
image
direkte ind i svaret, som om det var en streng eller iterabel. Kontrollerer kildekoden
for den angivne undtagelsessti ser vi, at objektet, der returneres af feltet, har den fornærmende linje i sin __iter__
metode - wrapper-klassen leder efter linjeterminatorer. Det er bestemt plausibelt, at den rå billedfil kan indeholde bytes, der ikke kan konverteres til noget, der kan sammenlignes med linjeterminatortegnene.
HttpResponse
mangler bare noget, den kan behandle som en streng - hvis du giver den en iterator, læser den det hele ind på én gang og opretter en streng, så der er ingen hukommelsesbesparelser:
https://docs.djangoproject.com/en/ dev/ref/request-response/#passing-iterators
Så du har brug for noget, der trækker indholdet af dit billedfilindpakningsobjekt uden at gå gennem iterationsgrænsefladen. læst metoden gør det ved at trække hele filens indhold ind, hvis du ikke giver den et antal bytes argument. Derfor er det første jeg vil prøve:
return HttpResponse(get_image.read(), mimetype="image/png")
Dette er ikke testet, så jeg har måske overset noget.
Du kan også prøve at profilere det nemmere tilfælde med at lade din hosting-webserver håndtere billederne og bare sende en omdirigering til URL
returneret fra FileField
. Det ville indebære en ekstra HTTP-rundtur for at fortælle browseren, hvor den skal kigge, så jeg tror ikke, der er en universel regel for, hvilken tilgang der vil være hurtigere.