Stai passando il valore restituito da FileField
image
direttamente nella risposta come se fosse una stringa o un iterabile. Controllo del codice sorgente
per il percorso di eccezione fornito, vediamo che l'oggetto restituito dal campo ha la riga incriminata nel suo __iter__
metodo - la classe wrapper sta cercando i terminatori di riga. È certamente plausibile che il file di immagine non elaborato possa contenere byte che non possono essere convertiti in qualcosa che può essere confrontato con i caratteri di terminazione di riga.
Il HttpResponse
ha solo bisogno di qualcosa che può trattare come una stringa - se gli dai un iteratore, lo legge tutto in una volta e crea una stringa, quindi non ci sono risparmi di memoria disponibili:
https://docs.djangoproject.com/en/ dev/ref/request-response/#passing-iterators
Quindi hai bisogno di qualcosa che estragga il contenuto del tuo oggetto wrapper del file immagine senza passare attraverso l'interfaccia di iterazione. Il leggi il metodo lo fa, inserendo l'intero contenuto del file se non gli dai un numero di byte come argomento. Quindi, la prima cosa che proverei è:
return HttpResponse(get_image.read(), mimetype="image/png")
Questo non è testato, quindi potrei aver trascurato qualcosa.
Potresti anche provare a profilare il caso più semplice di lasciare che il tuo server web di hosting gestisca le immagini e semplicemente servire un reindirizzamento a URL
restituito da FileField
. Ciò comporterebbe un ulteriore round trip HTTP per dire al browser dove cercare, quindi non credo che ci sia una regola universale per cui l'approccio sarà più veloce.