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)

Substitúa os URL e os nomes de ficheiro polos da aplicación. Para unha descarga permitida dun ficheiro público sen autenticación de proxy, a lista de proxies HTTP pode fornecer puntos finais candidatos para o URL do proxy. Este abridor de urllib dedicado usa un proxy HTTP para un destino HTTPS coa verificación normal do certificado. Non instala un abridor global; a autenticación, se fai falta, require a súa configuración admitida.

copyfileobj copia por bloques. Saír do contexto do ficheiro péchao e baleira as escrituras almacenadas antes de que os.replace instale o nome final.

Se a solicitude ou a copia xera un erro, omítese o cambio de nome. Pode quedar un ficheiro parcial segundo a política de limpeza, e este fluxo deixa intacto un ficheiro final existente nese fallo. Se ten éxito, a substitución pode sobrescribir ese ficheiro final, así que escolla a política a propósito.

Use nomes temporais únicos para traballos simultáneos. Os obxectos abridor separados non protexen os traballos que comparten a mesma ruta .part.

O axuste de 20 segundos limita as operacións de socket admitidas, non o tempo total de descarga. Un prazo para todo o traballo necesita un tratamento aparte na aplicación. A finalización da transferencia tamén é independente da verificación do ficheiro descargado.

Artigos relacionados