Você está passando o valor retornado pelo
FileField
image
diretamente na resposta como se fosse uma string ou iterável. Verificando o código-fonte
para o caminho de exceção fornecido, vemos que o objeto retornado pelo campo tem a linha incorreta em seu __iter__
método - a classe wrapper está procurando por terminadores de linha. É certamente plausível que o arquivo de imagem bruto possa conter bytes que não podem ser convertidos em algo que possa ser comparado com os caracteres de terminação de linha. O
HttpResponse
só precisa de algo que possa tratar como uma string - se você der um iterador, ele lê tudo de uma vez e cria uma string, para que não haja economia de memória disponível:https://docs.djangoproject.com/en/ dev/ref/request-response/#passing-iterators
Portanto, você precisa de algo que extraia o conteúdo do seu objeto wrapper de arquivo de imagem sem passar pela interface de iteração. A ler O método faz isso, puxando todo o conteúdo do arquivo se você não fornecer um argumento de número de bytes. Assim, a primeira coisa que eu tentaria é:
return HttpResponse(get_image.read(), mimetype="image/png")
Isso não foi testado, então eu posso ter esquecido alguma coisa.
Você também pode tentar criar o perfil do caso mais simples de deixar seu servidor web de hospedagem manipular as imagens e apenas servir um redirecionamento para o URL retornado do
FileField
. Isso envolveria uma viagem de ida e volta HTTP adicional para informar ao navegador onde procurar, então não acho que haja uma regra universal para qual abordagem será mais rápida.