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)

Byt ut URL:erna och filnamnen mot applikationens egna. För en tillåten nedladdning av en offentlig fil utan proxyautentisering kan HTTP-proxylistan tillhandahålla kandidatslutpunkter för proxy-URL:en. Denna dedikerade urllib-öppnare använder en HTTP-proxy för ett HTTPS-mål med normal certifikatverifiering. Den installerar ingen global öppnare; autentisering kräver, om det behövs, dess stödda inställning.

copyfileobj kopierar i bitar. När filkontexten lämnas stängs filen och buffrade skrivningar spolas ut innan os.replace ställer in det slutliga namnet.

Om begäran eller kopieringen kastar ett fel hoppas bytet av namn över. En delvis fil kan bli kvar för städningspolicyn, och detta flöde lämnar en befintlig slutlig fil orörd vid det felet. Vid framgång kan ersättningen skriva över den slutliga filen, så välj policyn medvetet.

Använd unika tillfälliga namn för samtidiga jobb. Separata öppnarobjekt skyddar inte jobb som delar samma .part-sökväg.

Inställningen på 20 sekunder begränsar stödda socketoperationer, inte den totala nedladdningstiden. En tidsgräns för hela jobbet kräver separat hantering i applikationen. Slutförandet av överföringen är också skilt från verifieringen av den nedladdade filen.

Relaterade artiklar