Python urllib: combinar o encaminhamento por proxy com a Basic Authentication do site
Combine o encaminhamento do urllib e a Basic authentication do destino num único opener explícito sem substituir o opener global duas vezes.
Chamar install_opener() duas vezes não adiciona o segundo opener ao primeiro. Substitui o opener padrão do módulo. Se um objeto conhece o proxy e outro o login do site, construa um único opener com os handlers necessários.
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 são exemplos. Para um serviço público alcançável através de um proxy HTTP público, a lista de proxies HTTP fornece endpoints candidatos para o handler de encaminhamento. Este opener encaminha o pedido HTTPS através do proxy HTTP e trata o desafio Basic do destino. Não configura a autenticação do proxy.
Se o proxy também exigir login, escolha separadamente um esquema de autenticação de proxy suportado. Um 407 no momento do CONNECT ocorre antes de o destino poder emitir o seu próprio desafio. Adicionar credenciais do site ao gestor de palavras-passe não pode satisfazer essa troca anterior.
Chamar opener.open() diretamente mantém a configuração junto à operação. Não é necessário alterar o padrão de todo o módulo, a menos que a aplicação queira deliberadamente que todas as chamadas de conveniência partilhem este opener.