Python urllib: combinar o enrutamento de proxy coa Basic Authentication do sitio web
Combine o enrutamento de urllib e a autenticación Basic do destino nun único opener explícito sen substituír o opener global dúas veces.
Chamar install_opener() dúas veces non engade o segundo opener ao primeiro. Substitúe o opener predeterminado do módulo. Se un obxecto coñece o proxy e outro o inicio de sesión do sitio, construíde un único opener cos handlers necesarios.
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()O proxy e o destino son exemplos. Para un servizo público ao que se poida chegar mediante un proxy HTTP público, a lista de proxies HTTP fornece endpoints candidatos para o handler de enrutamento. Este opener encamiña a solicitude HTTPS a través do proxy HTTP e xestiona o desafío Basic do destino. Non configura a autenticación do proxy.
Se o proxy tamén require inicio de sesión, escollede por separado un esquema de autenticación de proxy compatible. Un 407 no momento de CONNECT prodúcese antes de que o destino poida emitir o seu propio desafío. Engadir credenciais do sitio ao xestor de contrasinais non pode satisfacer ese intercambio anterior.
Chamar opener.open() directamente mantén a configuración coa operación. Non é necesario cambiar o predeterminado de todo o módulo, a menos que a aplicación queira deliberadamente que todas as chamadas de conveniencia compartan este opener.