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)

Korvaa URL-osoitteet ja tiedostonimet sovelluksen omilla. Sallitulle julkisen tiedoston lataukselle ilman proksin todennusta HTTP-proksiluettelo voi tarjota ehdokaspäätepisteitä proksin URL-osoitteelle. Tämä erityinen urllib-avaaja käyttää HTTP-proksia HTTPS-kohteeseen tavallisella varmenteen tarkistuksella. Se ei asenna yleistä avaajaa; todennus vaatii tarvittaessa sen tuetun asetukset.

copyfileobj kopioi paloina. Tiedostokontekstista poistuminen sulkee tiedoston ja tyhjentää puskuroidut kirjoitukset ennen kuin os.replace asettaa lopullisen nimen.

Jos pyyntö tai kopiointi heittää poikkeuksen, uudelleennimeäminen ohitetaan. Siivouskäytännön mukaan osittainen tiedosto voi jäädä, ja tämä kulku jättää olemassa olevan lopullisen tiedoston koskemattomaksi kyseisessä virheessä. Onnistuessaan korvaaminen voi korvata kyseisen lopullisen tiedoston, joten valitse käytäntö tietoisesti.

Käytä ainutlaatuisia väliaikaisia nimiä rinnakkaisille töille. Erilliset avaajaobjektit eivät suojaa töitä, jotka jakavat saman .part-polun.

20 sekunnin asetus rajoittaa tuettuja socket-toimintoja, ei koko latausaikaa. Koko työn määräaika vaatii erillisen käsittelyn sovelluksessa. Siirron valmistuminen on myös erillään ladatun tiedoston vahvistamisesta.

Aiheeseen liittyvät artikkelit