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)

Anstataŭigu la URL-ojn kaj dosiernomojn per tiuj de la aplikaĵo. Por permesita elŝuto de publika dosiero sen prokura aŭtentikigo, la listo de HTTP-prokuradoj povas liveri kandidatajn finpunktojn por la prokura URL. Ĉi tiu dediĉita urllib-malfermilo uzas HTTP-prokuron por HTTPS-celo kun normala atestila kontrolo. Ĝi ne instalas tutmondan malfermilon; aŭtentikigo, se necesa, postulas ĝian subtenatan agordon.

copyfileobj kopias laŭ blokoj. Forlasi la dosierkontekston fermas ĝin kaj malplenigas bufritajn skribojn antaŭ ol os.replace starigas la finan nomon.

Se la peto aŭ la kopiado ĵetas eraron, la renomado estas preterlasita. Parta dosiero povas resti por la puriga politiko, kaj ĉi tiu fluo lasas ekzistantan finan dosieron netuŝita ĉe tiu fiasko. Ĉe sukceso la anstataŭigo povas anstataŭigi tiun finan dosieron, do elektu la politikon konscie.

Uzu unikajn provizorajn nomojn por samtempaj taskoj. Apartaj malfermilaj objektoj ne protektas taskojn, kiuj dividas la saman vojon .part.

La agordo de 20 sekundoj limigas subtenatajn ingo-operaciojn, ne la totalan elŝuttempon. Por la tuta tasko necesas aparta limdato en la aplikaĵo. La kompletigo de la transdono ankaŭ estas aparta de kontrolado de la elŝutita dosiero.

Rilataj artikoloj