Стримување преземање преку прокси во датотека со 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 секунди ги ограничува поддржаните сокет-операции, а не вкупното време на преземање. За целата задача е потребно посебно ракување во апликацијата. Завршувањето на преносот исто така е одвоено од проверката на преземената датотека.