Stream en proxydownload til en fil med Python urllib
Stream en proxydownload til en midlertidig fil, og offentliggør først det endelige filnavn, når kopieringen er fuldført.
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)Erstat URL'erne og filnavnene med applikationens egne. Til en tilladt download af en offentlig fil uden proxygodkendelse kan HTTP-proxylisten levere kandidat-endpoints til proxy-URL'en. Denne dedikerede urllib-opener bruger en HTTP-proxy til en HTTPS-destination med normal certifikatverifikation. Den installerer ikke en global opener; godkendelse kræver, hvis den er nødvendig, dens understøttede opsætning.
copyfileobj kopierer i bidder. Når filkonteksten forlades, lukkes filen, og bufferede skrivninger skubbes ud, før os.replace installerer det endelige navn.
Hvis anmodningen eller kopieringen rejser en fejl, springes omdøbningen over. En delvis fil kan blive tilbage til oprydningspolitikken, og dette flow lader en eksisterende endelig fil være urørt ved den fejl. Ved succes kan erstatningen overskrive den endelige fil, så vælg politikken bevidst.
Brug unikke midlertidige navne til samtidige job. Separate opener-objekter beskytter ikke job, der deler den samme .part-sti.
Indstillingen på 20 sekunder begrænser understøttede socket-operationer frem for den samlede downloadtid. En frist for hele jobbet kræver særskilt håndtering i applikationen. Fuldførelsen af overførslen er også adskilt fra verificeringen af den downloadede fil.