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)

Vervang de URL's en bestandsnamen door die van de toepassing. Voor een toegestane download van een openbaar bestand zonder proxy-authenticatie kan de HTTP-proxylijst kandidaat-eindpunten leveren voor de proxy-URL. Deze speciale urllib-opener gebruikt een HTTP-proxy voor een HTTPS-bestemming met normale certificaatverificatie. Hij installeert geen globale opener; authenticatie vereist, indien nodig, de ondersteunde configuratie ervan.

copyfileobj kopieert in blokken. Het verlaten van de bestandscontext sluit het bestand en spoelt gebufferde schrijfacties voordat os.replace de definitieve naam instelt.

Als het verzoek of het kopiëren een fout opwerpt, wordt het hernoemen overgeslagen. Een gedeeltelijk bestand kan achterblijven voor het opruimbeleid, en deze stroom laat een bestaand definitief bestand ongemoeid bij die fout. Bij succes kan de vervanging dat definitieve bestand overschrijven, dus kies het beleid bewust.

Gebruik unieke tijdelijke namen voor gelijktijdige taken. Afzonderlijke opener-objecten beschermen taken die hetzelfde .part-pad delen niet.

De instelling van 20 seconden begrenst ondersteunde socketbewerkingen, niet de totale downloadtijd. Een deadline voor de hele taak vereist aparte afhandeling in de toepassing. Het voltooien van de overdracht staat ook los van het verifiëren van het gedownloade bestand.

Gerelateerde artikelen