Chiamare install_opener() due volte non aggiunge il secondo opener al primo. Sostituisce l'opener predefinito del modulo. Se un oggetto conosce il proxy e un altro il login del sito, costruisci un unico opener con gli handler necessari.

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()

Il proxy e la destinazione sono esempi. Per un servizio pubblico raggiungibile tramite un proxy HTTP pubblico, la lista di proxy HTTP fornisce endpoint candidati per l'handler di instradamento. Questo opener instrada la richiesta HTTPS attraverso il proxy HTTP e gestisce la sfida Basic della destinazione. Non configura l'autenticazione del proxy.

Se anche il proxy richiede un login, scegli separatamente una soluzione supportata di autenticazione proxy. Un 407 al momento del CONNECT si verifica prima che la destinazione possa emettere la propria sfida. Aggiungere le credenziali del sito al gestore delle password non può soddisfare quello scambio precedente.

Chiamare opener.open() direttamente mantiene la configurazione con l'operazione. Non serve modificare il valore predefinito del modulo, a meno che l'applicazione voglia deliberatamente che tutte le chiamate di comodo condividano questo opener.

Articoli correlati