install_opener() функциясын екі рет шақыру екінші opener-ді біріншісіне қоспайды. Ол модульдің әдепкі opener-ін ауыстырады. Егер бір нысан proxy-ді, ал екіншісі сайтқа кіруді білсе, қажет 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()

Proxy мен меже мысалдар. Жалпы HTTP proxy арқылы қол жеткізуге болатын жалпы қызмет үшін HTTP proxy тізімі маршруттау handler-іне кандидат endpoint-тер ұсынады. Бұл opener HTTPS сұранысын HTTP proxy арқылы жібереді және меженің Basic шақыруын өңдейді. Ол proxy аутентификациясын конфигурацияламайды.

Егер proxy де кіруді талап етсе, қолдау көрсетілетін proxy-аутентификация схемасын бөлек таңдаңыз. CONNECT кезеңіндегі 407 меже өз шақыруын шығарар алдында орын алады. Сайттың тіркелгі деректерін құпиясөз менеджеріне қосу сол ертеректегі алмасуды қанағаттандыра алмайды.

opener.open() тікелей шақыру конфигурацияны операциямен бірге ұстайды. Қолданба барлық ыңғайлы шақырулар осы opener-ді бөлісуін әдейі қаламаса, модуль деңгейіндегі әдепкіні өзгертудің қажеті жоқ.

Қатысты мақалалар