Straume ei proxy-nedlasting til ei fil med Python urllib
Straume ei proxy-nedlasting til ei mellombels fil, og kunngjer det endelege filnamnet først når kopieringa er fullfø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)Byt ut URL-ane og filnamna med dei applikasjonen brukar. For ei tillaten nedlasting av ei offentleg fil utan proxy-autentisering kan HTTP-proxylista levera kandidat-endepunkt for proxy-URL-en. Denne særskilde urllib-opnaren brukar ein HTTP-proxy til ein HTTPS-destinasjon med vanleg sertifikatverifisering. Han installerer ikkje ein global opnar; autentisering krev, om naudsynt, den støtta oppsetjinga hans.
copyfileobj kopierer i bitar. Når filkonteksten blir forlaten, blir fila lukka og bufferra skrivingar skyvne ut før os.replace set det endelege namnet.
Viss førespurnaden eller kopieringa kastar ein feil, blir omdøyppinga hoppa over. Ei delvis fil kan bli liggjande for oppryddingspolicyen, og denne flyten lèt ei eksisterande endeleg fil vere urørd ved den feilen. Ved suksess kan erstatninga overskrive den endelege fila, så vel policyen medvite.
Bruk unike mellombelse namn for samtidige jobbar. Separate opnarobjekt vernar ikkje jobbar som deler same .part-sti.
Innstillinga på 20 sekund avgrensar støtta socket-operasjonar, ikkje den totale nedlastingstida. Ein frist for heile jobben krev eigen handsaming i applikasjonen. Fullføringa av overføringa er også skild frå verifiseringa av den nedlasta fila.