with session.get(url, stream=True, proxies=routes,
                 timeout=(5, 30)) as response:
    response.raise_for_status()
    with open(part_path, 'wb') as output:
        for chunk in response.iter_content(chunk_size=64 * 1024):
            if chunk:
                output.write(chunk)

Use este padrão com a sessão Requests existente da aplicação, as rotas de proxy, o URL e o caminho de saída temporário. Para uma rota HTTP pública, a lista de proxies HTTP fornece endereços candidatos para o seu mapeamento de proxy. O padrão de streaming consome o corpo de forma incremental em vez de obter response.content e depois escrever um segundo objeto de tamanho completo.

Mantenha essa propriedade durante todo o download: stream=True adia o corpo, mas acessar response.content depois ainda pode reuni-lo todo na memória. O tamanho do bloco de iter_content é uma preferência de leitura, não um pedido de codificação de transferência HTTP em blocos no site ou no proxy.

O gestor de contexto da resposta fecha a resposta mesmo que uma escrita falhe ou a aplicação pare cedo. O par de tempos limite ilustrativo não é um prazo de relógio para toda a transferência; defina a política de vida do download separadamente conforme necessário.

Após o consumo bem-sucedido, verifique o artefacto esperado pela aplicação antes de publicar o nome final. Em caso de interrupção, mantenha o ficheiro parcial apenas sob uma política de retoma deliberada, com metadados que identifiquem a representação remota. Um ficheiro temporário não vazio não é um download bem-sucedido.

Artigos relacionados