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)

Zamijenite URL-ove i nazive datoteka za aplikaciju. Za dopušteno preuzimanje javne datoteke bez autentifikacije proxyja, popis HTTP proxyja može dati kandidate za krajnje točke za URL proxyja. Ovaj namjenski urllib opener koristi HTTP proxy za HTTPS odredište uz uobičajenu provjeru certifikata. Ne instalira globalni opener; autentifikacija, ako je potrebna, zahtijeva njegovo podržano postavljanje.

copyfileobj kopira u dijelovima. Izlazak iz konteksta datoteke zatvara je i ispisuje međuspremljene zapise prije nego os.replace postavi konačno ime.

Ako zahtjev ili kopiranje izazove pogrešku, preimenovanje se preskače. Djelomična datoteka može ostati prema politici čišćenja, a ovaj tok ostavlja postojeću konačnu datoteku netaknutom pri tom neuspjehu. U slučaju uspjeha zamjena može prepisati tu konačnu datoteku, pa politiku odaberite svjesno.

Koristite jedinstvena privremena imena za paralelne poslove. Odvojeni opener objekti ne štite poslove koji dijele istu .part putanju.

Postavka od 20 sekundi ograničava podržane socket operacije, a ne ukupno vrijeme preuzimanja. Za cijeli posao potreban je poseban rok u aplikaciji. Završetak prijenosa također je odvojen od provjere preuzete datoteke.

Povezani članci