Pozivanje install_opener() dvaput ne dodaje drugi opener prvom. Ono zamenjuje podrazumevani opener modula. Ako jedan objekat zna proxy, a drugi prijavu na veb-stranicu, izgradite jedan opener sa potrebnim handlerima.

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 i odredište su primeri. Za javnu uslugu dostupnu preko javnog HTTP proxyja, lista HTTP proxyja daje kandidatne endpointove za handler usmeravanja. Ovaj opener usmerava HTTPS zahtev kroz HTTP proxy i rešava Basic izazov odredišta. Ne konfiguriše autentifikaciju proxyja.

Ako i proxy zahteva prijavu, odaberite podržani raspored autentifikacije proxyja odvojeno. 407 pri CONNECT-u nastaje pre nego odredište može izdati sopstveni izazov. Dodavanje akreditiva veb-stranice u upravitelj lozinki ne može zadovoljiti tu raniju razmenu.

Direktno pozivanje opener.open() zadržava konfiguraciju uz operaciju. Nema potrebe menjati podrazumevano na nivou modula osim ako aplikacija namerno želi da svi praktični pozivi dele ovaj opener.

Povezani članci