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)

Substitua os URL e os nomes de ficheiro pelos da aplicação. Para um download permitido de um ficheiro público sem autenticação de proxy, a lista de proxies HTTP pode fornecer pontos finais candidatos para o URL do proxy. Este abridor urllib dedicado usa um proxy HTTP para um destino HTTPS com a verificação normal do certificado. Não instala um abridor global; a autenticação, se necessária, exige a sua configuração suportada.

copyfileobj copia em blocos. Sair do contexto do ficheiro fecha-o e liberta as escritas em memória intermédia antes de os.replace instalar o nome final.

Se o pedido ou a cópia gerar um erro, a renomeação é ignorada. Pode ficar um ficheiro parcial para a política de limpeza, e este fluxo deixa um ficheiro final existente intacto nessa falha. Em caso de sucesso, a substituição pode sobrescrever esse ficheiro final, por isso escolha a política deliberadamente.

Utilize nomes temporários únicos para trabalhos simultâneos. Objetos abridor separados não protegem trabalhos que partilham o mesmo caminho .part.

A definição de 20 segundos limita as operações de socket suportadas, não o tempo total de download. Um prazo para todo o trabalho requer um tratamento separado na aplicação. A conclusão da transferência também é separada da verificação do ficheiro transferido.

Artigos relacionados