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)

URL'leri ve dosya adlarını uygulamanınkilerle değiştirin. Proxy kimlik doğrulaması olmadan izin verilen bir genel dosya indirmesi için HTTP proxy listesi, proxy URL'si için aday uç noktalar sağlayabilir. Bu özel urllib açıcısı, normal sertifika doğrulamasıyla HTTPS hedefine bir HTTP proxy kullanır. Genel bir açıcı kurmaz; kimlik doğrulama gerekirse desteklenen kurulumunu gerektirir.

copyfileobj parçalar hâlinde kopyalar. Dosya bağlamından çıkmak dosyayı kapatır ve os.replace son adı yerleştirmeden önce arabelleğe alınmış yazmaları boşaltır.

İstek veya kopyalama bir hata oluşturursa yeniden adlandırma atlanır. Temizleme ilkesi için kısmi bir dosya kalabilir ve bu akış, o hatada var olan son dosyayı dokunmadan bırakır. Başarı durumunda değiştirme o son dosyanın üzerine yazabilir, bu yüzden ilkeyi bilinçli olarak seçin.

Eşzamanlı işler için benzersiz geçici adlar kullanın. Ayrı açıcı nesneleri aynı .part yolunu paylaşan işleri korumaz.

20 saniyelik ayar, toplam indirme süresini değil desteklenen soket işlemlerini sınırlar. İşin tamamı için bir son tarih, uygulamada ayrı bir işlem gerektirir. Aktarımın tamamlanması da indirilen dosyanın doğrulanmasından ayrıdır.

İlgili makaleler