È possibile utilizzare l' response.raw
oggetto file o scorrere la risposta.
L'uso response.raw
dell'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_content
attributo su True
(lo requests
imposta False
per 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=True
modo che requests
non scarichi prima l'intera immagine in memoria.