Pozivanje install_opener() dvaput ne dodaje drugi opener prvom. Ono zamjenjuje zadani opener modula. Ako jedan objekt zna proxy, a drugi prijavu na web-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 primjeri. Za javnu uslugu kojoj se može pristupiti preko javnog HTTP proxyja, lista HTTP proxyja daje kandidatne endpointove za handler usmjeravanja. Ovaj opener usmjerava HTTPS zahtjev kroz HTTP proxy i rješava Basic izazov odredišta. Ne konfiguriše autentifikaciju proxyja.

Ako i proxy zahtijeva prijavu, odaberite podržani raspored autentifikacije proxyja odvojeno. 407 pri CONNECT-u nastaje prije nego odredište može izdati vlastiti izazov. Dodavanje akreditiva web-stranice u upravitelj lozinki ne može zadovoljiti tu raniju razmjenu.

Direktno pozivanje opener.open() zadržava konfiguraciju uz operaciju. Nema potrebe mijenjati zadano na nivou modula osim ako aplikacija namjerno želi da svi praktični pozivi dijele ovaj opener.

Povezani članci