Python urllib: שילוב ניתוב proxy עם Basic Authentication של אתר
שלבו ניתוב urllib ואימות Basic של היעד ב-opener מפורש אחד בלי להחליף את ה-opener הגלובלי פעמיים.
קריאה ל-install_opener() פעמיים אינה מוסיפה את ה-opener השני לראשון. היא מחליפה את ה-opener המוגדר כברירת מחדל של המודול. אם אובייקט אחד מכיר את ה-proxy ואחר מכיר את ההתחברות לאתר, בנו opener יחיד עם ה-handlers הנדרשים.
import os
from urllib.request import (ProxyHandler, HTTPBasicAuthHandler,
HTTPPasswordMgrWithDefaultRealm, build_opener)
passwords = HTTPPasswordMgrWithDefaultRealm()
passwords.add_password(None, 'https://example.com/private/',
os.environ['SITE_USER'], os.environ['SITE_PASSWORD'])
opener = build_opener(
ProxyHandler({'https': 'http://203.0.113.10:8080'}),
HTTPBasicAuthHandler(passwords),
)
with opener.open('https://example.com/private/report', timeout=10) as response:
body = response.read()ה-proxy והיעד הם דוגמאות. עבור שירות ציבורי שניתן להגיע אליו דרך proxy HTTP ציבורי, רשימת ה-proxy של HTTP מספקת נקודות קצה מועמדות ל-handler הניתוב. ה-opener הזה מנתב את בקשת ה-HTTPS דרך ה-proxy ומטפל באתגר Basic של היעד. הוא אינו מגדיר אימות proxy.
אם גם ה-proxy דורש התחברות, בחרו בנפרד סידור אימות proxy נתמך. 407 בזמן CONNECT מתרחש לפני שהיעד יכול להנפיק אתגר משלו. הוספת פרטי האתר למנהל הסיסמאות אינה יכולה לספק את החליפין המוקדם הזה.
קריאה ישירה ל-opener.open() שומרת על התצורה לצד הפעולה. אין צורך לשנות את ברירת המחדל של המודול כולו, אלא אם היישום רוצה במכוון שכל קריאות הנוחות ישתפו את ה-opener הזה.