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