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)

Nahraďte URL adresy a názvy súborov podľa aplikácie. Pre povolené stahovanie verejného súboru bez autentifikácie proxy môže zoznam HTTP proxy poskytnúť kandidátov na koncové body pre URL proxy. Tento vyhradený opener urllib používa HTTP proxy pre cieľ HTTPS s bežným overením certifikátu. Neinštaluje globálny opener; autentifikácia, ak je potrebná, vyžaduje jeho podporované nastavenie.

copyfileobj kopíruje po častiach. Opustenie kontextu súboru ho zatvorí a vyprázdni bufferované zápisy, kým os.replace nastaví konečný názov.

Ak požiadavka alebo kopírovanie vyvolá výnimku, premenovanie sa preskočí. Podľa zásady čistenia môže zostať čiastočný súbor a tento tok pri takom zlyhaní ponechá existujúci konečný súbor nedotknutý. Pri úspechu môže nahradenie tento konečný súbor prepísať, preto zásadu zvoľte vedome.

Pre súbežné úlohy používajte jedinečné dočasné názvy. Samostatné objekty opener nechránia úlohy, ktoré zdieľajú rovnakú cestu .part.

Nastavenie 20 sekúnd obmedzuje podporované operácie socketu, nie celkový čas stahovania. Pre celú úlohu je potrebný samostatný termín v aplikácii. Dokončenie prenosu je tiež oddelené od overenia stiahnutého súboru.

Súvisiace články