install_opener() দুবার কল করলে দ্বিতীয় opener প্রথমটির সাথে যোগ হয় না। এটি মডিউলের ডিফল্ট opener প্রতিস্থাপন করে। যদি একটি অবজেক্ট প্রক্সি জানে এবং অন্যটি ওয়েবসাইট লগইন জানে, তবে প্রয়োজনীয় handler সহ একটি 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-এর জন্য প্রার্থী endpoint দেয়। এই opener HTTPS অনুরোধ HTTP প্রক্সি দিয়ে পাঠায় এবং গন্তব্যের Basic চ্যালেঞ্জ সামলায়। এটি প্রক্সি প্রমাণীকরণ কনফিগার করে না।

যদি প্রক্সিও লগইন চায়, তবে সমর্থিত প্রক্সি-প্রমাণীকরণ ব্যবস্থা আলাদাভাবে বেছে নিন। CONNECT সময়ে 407 গন্তব্য নিজের চ্যালেঞ্জ দেওয়ার আগে ঘটে। পাসওয়ার্ড ম্যানেজারে ওয়েবসাইট ক্রেডেনশিয়াল যোগ করলে সেই আগের বিনিময় মেটানো যায় না।

opener.open() সরাসরি কল করলে কনফিগারেশনটি কাজের সাথে থাকে। মডিউল-ব্যাপী ডিফল্ট বদলানোর দরকার নেই, যদি না অ্যাপ্লিকেশন সচেতনভাবে চায় সব সুবিধাজনক কল এই opener ভাগ করুক।

সম্পর্কিত নিবন্ধ