Pretakanje prenosa prek proxyja v datoteko s Python urllib
Pretakajte prenos prek proxyja v začasno datoteko in končno ime datoteke objavite šele po končanem kopiranju.
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)Zamenjajte URL-je in imena datotek s tistimi v aplikaciji. Za dovoljen prenos javne datoteke brez avtentikacije proxyja lahko seznam proxyjev HTTP ponudi kandidate za končne točke za URL proxyja. Ta namenski opener urllib uporablja proxy HTTP za cilj HTTPS z običajnim preverjanjem potrdila. Ne namesti globalnega openerja; avtentikacija, če je potrebna, zahteva njegovo podprto nastavitev.
copyfileobj kopira po kosih. Izhod iz konteksta datoteke jo zapre in izprazni medpomnjene zapise, preden os.replace nastavi končno ime.
Če zahteva ali kopiranje sproži napako, se preimenovanje preskoči. Delna datoteka lahko ostane za politiko čiščenja, in ta tok pusti obstoječo končno datoteko nedotaknjeno ob tej napaki. Ob uspehu lahko zamenjava prepiše to končno datoteko, zato politiko izberite zavestno.
Za sočasna opravila uporabite edinstvena začasna imena. Ločeni objekti opener ne ščitijo opravil, ki si delijo isto pot .part.
Nastavitev 20 sekund omejuje podprte operacije vtičnic, ne skupnega časa prenosa. Za celotno opravilo je potrebna ločena obravnava v aplikaciji. Dokončanje prenosa je prav tako ločeno od preverjanja prenesene datoteke.