Python urllib: поєднання маршрутизації через проксі з Basic Authentication сайту
Поєднайте маршрутизацію urllib і Basic authentication місця призначення в одному явному opener, не замінюючи глобальний opener двічі.
Виклик 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-проксі дає кандидатів в endpoint-и для handler маршрутизації. Цей opener спрямовує HTTPS-запит через HTTP-проксі та обробляє Basic-виклик призначення. Він не налаштовує автентифікацію проксі.
Якщо проксі також потребує входу, виберіть підтримувану схему автентифікації проксі окремо. 407 під час CONNECT виникає раніше, ніж призначення може видати власний виклик. Додавання облікових даних сайту до менеджера паролів не задовольнить той раніший обмін.
Прямий виклик opener.open() зберігає конфігурацію разом з операцією. Немає потреби змінювати стандарт на рівні модуля, якщо тільки програма навмисно не хоче, щоб усі зручні виклики використовували цей opener.