Python urllib: съчетаване на прокси маршрутизация с Basic удостоверяване на сайт
Съчетайте urllib маршрутизацията и Basic удостоверяването на дестинацията в един явен opener, без да заменяте глобалния opener два пъти.
Извикването на install_opener() два пъти не добавя втория opener към първия. То заменя opener-а по подразбиране на модула. Ако един обект знае проксито, а друг — входа на сайта, изградете един opener с необходимите handlers.
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.