Trasmettere in streaming un download tramite proxy su un file con Python urllib
Trasmettete in streaming un download tramite proxy su un file temporaneo e pubblicate il nome finale del file solo dopo il completamento della copia.
import os
import shutil
from urllib.request import ProxyHandler, build_opener
proxy = 'http://proxy.example.net:8080'
opener = build_opener(ProxyHandler({
'http': proxy,
'https': proxy,
}))
temporary = 'archive.zip.part'
destination = 'archive.zip'
with opener.open('https://downloads.example.net/archive.zip',
timeout=20) as response:
with open(temporary, 'wb') as output:
shutil.copyfileobj(response, output)
os.replace(temporary, destination)Sostituite gli URL e i nomi dei file con quelli dell'applicazione. Per un download consentito di un file pubblico senza autenticazione proxy, il elenco di proxy HTTP può fornire endpoint candidati per l'URL del proxy. Questo opener urllib dedicato usa un proxy HTTP per una destinazione HTTPS con la normale verifica del certificato. Non installa un opener globale; l'autenticazione, se necessaria, richiede la sua configurazione supportata.
copyfileobj copia a blocchi. Uscire dal contesto del file lo chiude e scarica le scritture bufferizzate prima che os.replace installi il nome finale.
Se la richiesta o la copia genera un errore, la rinomina viene saltata. Un file parziale può restare per la politica di pulizia, e questo flusso lascia intatto un file finale esistente in quel fallimento. In caso di successo la sostituzione può sovrascrivere quel file finale, quindi scegliete la politica deliberatamente.
Usate nomi temporanei univoci per i lavori concorrenti. Oggetti opener separati non proteggono i lavori che condividono lo stesso percorso .part.
L'impostazione di 20 secondi limita le operazioni socket supportate, non il tempo totale di download. Una scadenza per l'intero lavoro richiede una gestione separata nell'applicazione. Il completamento del trasferimento è anch'esso separato dalla verifica del file scaricato.