install_opener() को दो बार कॉल करने से दूसरा opener पहले में नहीं जुड़ता। यह मॉड्यूल के डिफ़ॉल्ट opener को बदल देता है। यदि एक ऑब्जेक्ट प्रॉक्सी जानता है और दूसरा वेबसाइट लॉगिन, तो आवश्यक handlers वाला एक ही opener बनाएँ।

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()

प्रॉक्सी और गंतव्य उदाहरण हैं। सार्वजनिक HTTP प्रॉक्सी के माध्यम से पहुँचने योग्य सार्वजनिक सेवा के लिए HTTP प्रॉक्सी सूची रूटिंग handler के लिए उम्मीदवार endpoints देती है। यह opener HTTPS अनुरोध को HTTP प्रॉक्सी से भेजता है और गंतव्य की Basic चुनौती संभालता है। यह प्रॉक्सी प्रमाणीकरण कॉन्फ़िगर नहीं करता।

यदि प्रॉक्सी को भी लॉगिन चाहिए, तो समर्थित प्रॉक्सी-प्रमाणीकरण व्यवस्था अलग से चुनें। CONNECT के समय 407 तब होता है जब गंतव्य अपनी चुनौती जारी नहीं कर सका। पासवर्ड मैनेजर में वेबसाइट क्रेडेंशियल जोड़ने से वह पहले वाला आदान-प्रदान संतुष्ट नहीं होगा।

opener.open() को सीधे कॉल करने से कॉन्फ़िगरेशन ऑपरेशन के साथ रहता है। मॉड्यूल-व्यापी डिफ़ॉल्ट बदलने की आवश्यकता नहीं है, जब तक एप्लिकेशन जानबूझकर न चाहे कि सभी सुविधाजनक कॉल यह opener साझा करें।

संबंधित लेख