Diffuser en flux un téléchargement via un proxy vers un fichier avec Python urllib
Diffusez en flux un téléchargement via un proxy vers un fichier temporaire et ne publiez le nom final du fichier qu'une fois la copie terminée.
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)Remplacez les URL et les noms de fichiers par ceux de l'application. Pour un téléchargement autorisé de fichier public sans authentification de proxy, la liste de proxys HTTP peut fournir des points de terminaison candidats pour l'URL du proxy. Cet ouvreur urllib dédié utilise un proxy HTTP pour une destination HTTPS avec la vérification normale du certificat. Il n'installe pas d'ouvreur global ; l'authentification, si nécessaire, exige sa configuration prise en charge.
copyfileobj copie par blocs. Quitter le contexte du fichier le ferme et vide les écritures tamponnées avant que os.replace installe le nom final.
Si la requête ou la copie lève une erreur, le renommage est ignoré. Un fichier partiel peut subsister selon la politique de nettoyage, et ce flux laisse un fichier final existant intact lors de cet échec. En cas de succès, le remplacement peut écraser ce fichier final, choisissez donc la politique délibérément.
Utilisez des noms temporaires uniques pour les tâches concurrentes. Des objets ouvreurs distincts ne protègent pas les tâches qui partagent le même chemin .part.
Le réglage de 20 secondes limite les opérations de socket prises en charge, et non la durée totale du téléchargement. Une échéance pour l'ensemble de la tâche exige un traitement séparé dans l'application. L'achèvement du transfert est également distinct de la vérification du fichier téléchargé.