Å kalle install_opener() to gonger legg ikkje den andre openeren til den første. Det erstattar standard-openeren til modulen. Viss eitt objekt kjenner proxyen og eit anna kjenner innlogginga på nettstaden, bygg éin opener med dei naudsynte handlarane.

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

Proxyen og destinasjonen er døme. For ei offentleg teneste som kan nåast via ein offentleg HTTP-proxy, gjev HTTP-proxy-lista kandidat-endepunkt for ruting-handlaren. Denne openeren ruter HTTPS-førespurnaden gjennom HTTP-proxyen og handterer Basic-utfordringa til destinasjonen. Han konfigurerer ikkje proxy-autentisering.

Viss proxyen òg krev innlogging, vel ei støtta proxy-autentiseringsordning separat. Ein 407 ved CONNECT oppstår før destinasjonen kan gje ut si eiga utfordring. Å leggje innloggingsinformasjonen til nettstaden til passordhandteraren kan ikkje oppfylle den tidlegare utvekslinga.

Å kalle opener.open() direkte held konfigurasjonen saman med operasjonen. Det er ikkje naudsynt å endre standarden for heile modulen med mindre applikasjonen med vilje vil at alle bekveimekall skal dele denne openeren.

Relaterte artiklar