فراخوانی install_opener() دو بار، opener دوم را به اولی اضافه نمی‌کند. بلکه opener پیش‌فرض ماژول را جایگزین می‌کند. اگر یک شیء پروکسی را می‌شناسد و شیء دیگر ورود وب‌سایت را، یک opener واحد با handlerهای لازم بسازید.

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 مسیریابی فراهم می‌کند. این opener درخواست HTTPS را از پروکسی HTTP عبور می‌دهد و چالش Basic مقصد را مدیریت می‌کند. احراز هویت پروکسی را پیکربندی نمی‌کند.

اگر پروکسی هم ورود بخواهد، ترتیب احراز هویت پروکسی پشتیبانی‌شده را جداگانه انتخاب کنید. خطای 407 در زمان CONNECT پیش از آن رخ می‌دهد که مقصد بتواند چالش خود را صادر کند. افزودن اعتبارنامه‌های وب‌سایت به مدیر رمز نمی‌تواند آن تبادل پیشین را برآورده کند.

فراخوانی opener.open() به‌طور مستقیم پیکربندی را همراه با عملیات نگه می‌دارد. نیازی به تغییر پیش‌فرض در سطح ماژول نیست، مگر اینکه برنامه عمداً بخواهد همه فراخوانی‌های راحت این opener را به اشتراک بگذارند.

مقالات مرتبط