È possibile utilizzare l' response.rawoggetto file o scorrere la risposta.
L'uso response.rawdell'oggetto simile a un file non decodificherà, per impostazione predefinita, le risposte compresse (con GZIP o deflate). Puoi forzarlo a decomprimerlo comunque impostando l' decode_contentattributo su True(lo requestsimposta Falseper controllare la decodifica stessa). È quindi possibile utilizzare shutil.copyfileobj()per fare in modo che Python esegua lo streaming dei dati su un oggetto file:
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)
Per scorrere la risposta utilizzare un ciclo; iterando in questo modo si assicura che i dati vengano decompressi in questa fase:
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)
Questo leggerà i dati in blocchi da 128 byte; se ritieni che un'altra dimensione del blocco funzioni meglio, utilizza il Response.iter_content()metodo con una dimensione del blocco personalizzata:
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)
Nota che devi aprire il file di destinazione in modalità binaria per assicurarti che python non tenti di tradurre nuove righe per te. Abbiamo anche impostato in stream=Truemodo che requestsnon scarichi prima l'intera immagine in memoria.