Ein zweimaliger Aufruf von install_opener() fügt den zweiten Opener nicht dem ersten hinzu. Er ersetzt den Standard-Opener des Moduls. Wenn ein Objekt den Proxy und ein anderes den Website-Login kennt, bauen Sie einen einzigen Opener mit den nötigen Handlern.

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

Proxy und Ziel sind Beispiele. Für einen öffentlichen Dienst, der über einen öffentlichen HTTP-Proxy erreichbar sein kann, liefert die HTTP-Proxy-Liste Kandidaten-Endpunkte für den Routing-Handler. Dieser Opener leitet die HTTPS-Anfrage über den HTTP-Proxy und behandelt die Basic-Challenge des Ziels. Er konfiguriert keine Proxy-Authentifizierung.

Wenn auch der Proxy einen Login verlangt, wählen Sie eine unterstützte Proxy-Authentifizierungsvariante getrennt. Ein 407 bei CONNECT tritt auf, bevor das Ziel seine eigene Challenge ausgeben kann. Das Hinzufügen von Website-Anmeldedaten zum Passwort-Manager kann diesen früheren Austausch nicht erfüllen.

Der direkte Aufruf von opener.open() hält die Konfiguration bei der Operation. Der modulweite Standard muss nicht geändert werden, es sei denn, die Anwendung möchte bewusst, dass alle Komfortaufrufe diesen Opener teilen.

Ähnliche Artikel