Python urllib: combinar l'encaminament de proxy amb Basic Authentication del lloc web
Combineu l'encaminament d'urllib i l'autenticació Basic de la destinació en un sol opener explícit sense substituir l'opener global dues vegades.
Cridar install_opener() dues vegades no afegeix el segon opener al primer. Substitueix l'opener predeterminat del mòdul. Si un objecte coneix el proxy i un altre el login del lloc web, construïu un únic opener amb els handlers necessaris.
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()El proxy i la destinació són exemples. Per a un servei públic accessible mitjançant un proxy HTTP públic, la llista de proxys HTTP proporciona punts finals candidats per al handler d'encaminament. Aquest opener encamina la sol·licitud HTTPS a través del proxy HTTP i gestiona el repte Basic de la destinació. No configura l'autenticació del proxy.
Si el proxy també requereix un inici de sessió, trieu un esquema d'autenticació de proxy compatible per separat. Un 407 al moment de CONNECT es produeix abans que la destinació pugui emetre el seu propi repte. Afegir credencials del lloc web al gestor de contrasenyes no pot satisfer aquell intercanvi anterior.
Cridar opener.open() directament manté la configuració amb l'operació. No cal canviar el valor predeterminat del mòdul tret que l'aplicació vulgui deliberadament que totes les crides de conveniència comparteixin aquest opener.