Você pode usar o response.rawobjeto de arquivo ou iterar sobre a resposta.
Usar o response.rawobjeto semelhante a arquivo não decodifica, por padrão, as respostas compactadas (com GZIP ou desinflar). Você pode forçá-lo a descomprimir para você de qualquer maneira, definindo o decode_contentatributo como True( requestsdefine-o Falsepara controlar a decodificação). Você pode usar o shutil.copyfileobj()Python para transmitir os dados para um objeto de arquivo:
import requests
import shutil
r = requests.get(settings.STATICMAP_URL.format(**data), stream=True)
if r.status_code == 200:
with open(path, 'wb') as f:
r.raw.decode_content = True
shutil.copyfileobj(r.raw, f)
Para iterar sobre a resposta, use um loop; iterar dessa maneira garante que os dados sejam descompactados nesse estágio:
r = requests.get(settings.STATICMAP_URL.format(**data), stream=True)
if r.status_code == 200:
with open(path, 'wb') as f:
for chunk in r:
f.write(chunk)
Isso lerá os dados em blocos de 128 bytes; se você achar que outro tamanho de pedaço funciona melhor, use o Response.iter_content()método com um tamanho de pedaço personalizado:
r = requests.get(settings.STATICMAP_URL.format(**data), stream=True)
if r.status_code == 200:
with open(path, 'wb') as f:
for chunk in r.iter_content(1024):
f.write(chunk)
Observe que você precisa abrir o arquivo de destino no modo binário para garantir que o python não tente e traduza novas linhas para você. Também configuramos stream=Truepara que requestsnão faça o download da imagem inteira primeiro na memória.