Estás pasando el valor devuelto por el FileField
image
directamente en la respuesta como si fuera una cadena o iterable. Comprobando el código fuente
para la ruta de excepción dada, vemos que el objeto devuelto por el campo tiene la línea ofensiva en su __iter__
método:la clase contenedora está buscando terminadores de línea. Ciertamente es plausible que el archivo de imagen sin procesar pueda contener bytes que no se pueden convertir en algo que se pueda comparar con los caracteres de terminación de línea.
La HttpResponse
solo necesita algo que pueda tratar como una cadena:si le da un iterador, lo lee todo de una vez y crea una cadena, por lo que no hay ahorros de memoria disponibles:
https://docs.djangoproject.com/en/ dev/ref/request-response/#passing-iterators
Por lo tanto, necesita algo que extraiga el contenido de su objeto contenedor de archivo de imagen sin pasar por la interfaz de iteración. El leer El método hace eso, extrayendo todo el contenido del archivo si no le da un argumento de número de bytes. Por lo tanto, lo primero que intentaría es:
return HttpResponse(get_image.read(), mimetype="image/png")
Esto no se ha probado, por lo que podría haber pasado por alto algo.
También puede intentar perfilar el caso más simple de dejar que su servidor web de alojamiento maneje las imágenes y simplemente sirva una redirección al URL
devuelto desde el FileField
. Eso implicaría un viaje de ida y vuelta HTTP adicional para decirle al navegador dónde buscar, por lo que no creo que haya una regla universal sobre qué enfoque será más rápido.