Appeler install_opener() deux fois n'ajoute pas le second opener au premier. Cela remplace l'opener par défaut du module. Si un objet connaît le proxy et un autre la connexion au site, construisez un seul opener contenant les handlers requis.

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

Le proxy et la destination sont des exemples. Pour un service public accessible via un proxy HTTP public, la liste de proxys HTTP fournit des points de terminaison candidats pour le handler de routage. Cet opener achemine la requête HTTPS via le proxy HTTP et gère le défi Basic de la destination. Il ne configure pas l'authentification du proxy.

Si le proxy exige aussi une connexion, choisissez séparément un dispositif d'authentification proxy pris en charge. Un 407 au moment du CONNECT survient avant que la destination puisse émettre son propre défi. Ajouter les identifiants du site au gestionnaire de mots de passe ne peut pas satisfaire cet échange antérieur.

Appeler opener.open() directement conserve la configuration avec l'opération. Nul besoin de modifier la valeur par défaut du module, sauf si l'application veut délibérément que tous les appels de commodité partagent cet opener.

Articles similaires