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)

Palitan ang mga URL at pangalan ng file para sa aplikasyon. Para sa pinahihintulutang pag-download ng pampublikong file nang walang pagpapatunay ng proxy, ang listahan ng HTTP proxy ay makapagbibigay ng mga kandidatong endpoint para sa URL ng proxy. Ang nakalaang urllib opener na ito ay gumagamit ng HTTP proxy para sa HTTPS destination na may normal na pagpapatunay ng sertipiko. Hindi ito nag-i-install ng global opener; ang pagpapatunay, kung kailangan, ay nangangailangan ng sinusuportahang setup nito.

copyfileobj ay nangongopya nang paisa-isa. Ang paglabas sa konteksto ng file ay isinasara ito at pinapalabas ang mga naka-buffer na pagsulat bago ilagay ng os.replace ang huling pangalan.

Kung ang kahilingan o pagkopya ay nagbabangon ng error, ang pagpapalit ng pangalan ay nilalaktawan. Maaaring maiwan ang isang bahagyang file para sa patakaran ng paglilinis, at iniwan ng daloy na ito ang umiiral na huling file na hindi nagalaw sa pagkabigong iyon. Kapag nagtagumpay, maaaring i-overwrite ng pagpapalit ang huling file na iyon, kaya sadyang piliin ang patakaran.

Gumamit ng natatanging pansamantalang pangalan para sa magkakasabay na trabaho. Ang magkahiwalay na opener object ay hindi nagpoprotekta sa mga trabahong nagsasalo ng parehong landas na .part.

Ang setting na 20 segundo ay naglilimita sa mga sinusuportahang operasyon ng socket, hindi sa kabuuang oras ng pag-download. Ang takdang panahon para sa buong trabaho ay nangangailangan ng hiwalay na paghawak sa aplikasyon. Ang pagkumpleto ng paglilipat ay hiwalay din sa pagpapatunay ng na-download na file.

Kaugnay na mga artikulo