Twee keer install_opener() aanroepen voegt de tweede opener niet toe aan de eerste. Het vervangt de standaardopener van de module. Als het ene object de proxy kent en het andere de inlog van de website, bouw dan één opener met de benodigde handlers.

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

De proxy en de bestemming zijn voorbeelden. Voor een openbare dienst die bereikbaar is via een openbare HTTP-proxy, biedt de HTTP-proxylijst kandidaat-eindpunten voor de routing-handler. Deze opener leidt het HTTPS-verzoek via de HTTP-proxy en handelt de Basic-uitdaging van de bestemming af. Hij configureert geen proxy-authenticatie.

Als de proxy ook een inlog vereist, kies dan apart een ondersteunde proxy-authenticatieopstelling. Een 407 bij CONNECT treedt op voordat de bestemming zijn eigen uitdaging kan uitgeven. Het toevoegen van website-inloggegevens aan de wachtwoordbeheerder kan die eerdere uitwisseling niet vervullen.

Direct opener.open() aanroepen houdt de configuratie bij de bewerking. De modulebrede standaard hoeft niet te worden gewijzigd, tenzij de toepassing bewust wil dat alle gemaksaanroepen deze opener delen.

Gerelateerde artikelen