Потокове завантаження через проксі у файл за допомогою Python urllib
Передавайте завантаження через проксі потоком у тимчасовий файл і публікуйте остаточне ім'я файлу лише після завершення копіювання.
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-адреси та імена файлів на ті, що використовує застосунок. Для дозволеного завантаження публічного файлу без автентифікації проксі список HTTP-проксі може надати кандидатів у кінцеві точки для URL проксі. Цей спеціалізований відкривач urllib використовує HTTP-проксі для HTTPS-призначення зі звичайною перевіркою сертифіката. Він не встановлює глобальний відкривач; автентифікація, якщо вона потрібна, вимагає його підтримуваного налаштування.
copyfileobj копіює частинами. Вихід із контексту файлу закриває його та скидає буферизовані записи до того, як os.replace встановить остаточне ім'я.
Якщо запит або копіювання спричиняє помилку, перейменування пропускається. Частковий файл може залишитися для політики очищення, і цей потік залишає наявний кінцевий файл недоторканим у такій невдачі. У разі успіху заміна може перезаписати цей кінцевий файл, тому обирайте політику свідомо.
Використовуйте унікальні тимчасові імена для паралельних завдань. Окремі об'єкти-відкривачі не захищають завдання, що використовують той самий шлях .part.
Налаштування 20 секунд обмежує підтримувані операції сокета, а не загальний час завантаження. Для всього завдання потрібен окремий строк у застосунку. Завершення передавання також відокремлене від перевірки завантаженого файлу.