Python urllib: kombinera proxy-routing med Basic Authentication på webbplatsen
Kombinera urllib-routing och Basic-autentisering av målet i en enda explicit opener utan att byta ut den globala openern två gånger.
Att anropa install_opener() två gånger lägger inte till den andra openern till den första. Det ersätter modulens standard-opener. Om ett objekt känner till proxyn och ett annat känner till inloggningen på webbplatsen, bygg en enda opener med de nödvändiga handlarna.
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()Proxyn och målet är exempel. För en offentlig tjänst som nås via en offentlig HTTP-proxy ger HTTP-proxylistan kandidat-endpoints för routing-handlern. Den här openern dirigerar HTTPS-begäran genom HTTP-proxyn och hanterar målets Basic-utmaning. Den konfigurerar inte proxyautentisering.
Om proxyn också kräver inloggning, välj en stödd proxyautentiseringslösning separat. En 407 vid CONNECT inträffar innan målet kan utfärda sin egen utmaning. Att lägga webbplatsens inloggningsuppgifter i lösenordshanteraren kan inte uppfylla det tidigare utbytet.
Att anropa opener.open() direkt behåller konfigurationen med operationen. Det finns ingen anledning att ändra modulövergripande standard om inte applikationen medvetet vill att alla bekvämlighetsanrop ska dela den här openern.