Transmetre en flux una descàrrega a través d'un proxy a un fitxer amb Python urllib
Transmeteu en flux una descàrrega a través d'un proxy a un fitxer temporal i publiqueu el nom final del fitxer només quan la còpia s'hagi completat.
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)Substituïu les URL i els noms de fitxer per als de l'aplicació. Per a una descàrrega permesa d'un fitxer públic sense autenticació de proxy, la llista de proxies HTTP pot proporcionar punts finals candidats per a l'URL del proxy. Aquest opener dedicat d'urllib fa servir un proxy HTTP per a una destinació HTTPS amb la verificació normal del certificat. No instal·la cap opener global; l'autenticació, si cal, requereix la seva configuració admesa.
copyfileobj copia per blocs. Sortir del context del fitxer el tanca i buida les escriptures emmagatzemades abans que os.replace instal·li el nom final.
Si la sol·licitud o la còpia genera un error, es omet el canvi de nom. Pot quedar un fitxer parcial segons la política de neteja, i aquest flux deixa intacte un fitxer final existent en aquesta fallada. Si té èxit, la substitució pot sobreescriure aquest fitxer final, així que trieu la política deliberadament.
Utilitzeu noms temporals únics per als treballs concurrents. Els objectes opener separats no protegeixen els treballs que comparteixen el mateix camí .part.
El paràmetre de 20 segons limita les operacions de sòcol admeses, no el temps total de descàrrega. Un termini per a tot el treball necessita un tractament separat a l'aplicació. La finalització de la transferència també és separada de la verificació del fitxer descarregat.