Przekazujesz wartość zwróconą przez FileField
image
bezpośrednio w odpowiedzi, tak jakby była to ciąg znaków lub iterowalny. Sprawdzanie kodu źródłowego
dla podanej ścieżki wyjątku widzimy, że obiekt zwrócony przez pole ma nieprawidłową linię w swoim __iter__
metoda - klasa opakowująca szuka terminatorów linii. Z pewnością jest prawdopodobne, że surowy plik obrazu może zawierać bajty, których nie można przekonwertować na coś, co można porównać ze znakami końca linii.
HttpResponse
po prostu potrzebuje czegoś, co może traktować jako ciąg znaków - jeśli dasz mu iterator, odczytuje wszystko na raz i tworzy ciąg, więc nie ma dostępnej oszczędności pamięci:
https://docs.djangoproject.com/en/ dev/ref/request-response/#passing-iterators
Potrzebujesz więc czegoś, co wyciągnie zawartość twojego obiektu opakowującego plik obrazu bez przechodzenia przez interfejs iteracji. odczyt robi to metoda, ściągając całą zawartość pliku, jeśli nie podasz mu argumentu o liczbie bajtów. Dlatego pierwszą rzeczą, którą spróbowałem, to:
return HttpResponse(get_image.read(), mimetype="image/png")
To nie zostało przetestowane, więc mogłem coś przeoczyć.
Możesz również spróbować sprofilować prostszy przypadek, w którym serwer hostingowy obsługuje obrazy i po prostu udostępnia przekierowanie do URL
zwrócone z FileField
. Wymagałoby to dodatkowej podróży w obie strony HTTP, aby poinformować przeglądarkę, gdzie szukać, więc nie sądzę, że istnieje uniwersalna zasada, według której podejście będzie szybsze.