Python urllib: combinar el enrutamiento de proxy con la autenticación Basic del sitio web
Combine el enrutamiento de urllib y la autenticación Basic del destino en un único opener explícito sin sustituir el opener global dos veces.
Llamar a install_opener() dos veces no añade el segundo opener al primero. Sustituye el opener predeterminado del módulo. Si un objeto conoce el proxy y otro el inicio de sesión del sitio, construya un único opener con los 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()El proxy y el destino son ejemplos. Para un servicio público al que se pueda llegar mediante un proxy HTTP público, la lista de proxies HTTP ofrece endpoints candidatos para el handler de enrutamiento. Este opener enruta la solicitud HTTPS a través del proxy HTTP y gestiona el desafío Basic del destino. No configura la autenticación del proxy.
Si el proxy también requiere inicio de sesión, elija por separado un esquema de autenticación de proxy compatible. Un 407 en el momento de CONNECT ocurre antes de que el destino pueda emitir su propio desafío. Añadir credenciales del sitio al gestor de contraseñas no puede satisfacer ese intercambio anterior.
Llamar directamente a opener.open() mantiene la configuración junto a la operación. No hace falta cambiar el valor predeterminado de todo el módulo salvo que la aplicación quiera deliberadamente que todas las llamadas cómodas compartan este opener.