הזרמת הורדה דרך פרוקסי לקובץ עם 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 שניות מגבילה פעולות שקע נתמכות ולא את זמן ההורדה הכולל. מועד אחרון לכל המשימה מחייב טיפול נפרד ביישום. השלמת ההעברה נפרדת גם מאימות הקובץ שהורד.