Kutsumalla install_opener() kahdesti ei lisää toista openeria ensimmäiseen. Se korvaa moduulin oletus-openerin. Jos yksi objekti tuntee proxyn ja toinen verkkosivuston kirjautumisen, rakenna yksi opener tarvittavilla handlereilla.

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 ja kohde ovat esimerkkejä. Julkiselle palvelulle, johon voi päästä julkisen HTTP-proxyn kautta, HTTP-proxyluettelo tarjoaa ehdokaspäätepisteitä reitityshandlerille. Tämä opener reitittää HTTPS-pyynnön HTTP-proxyn kautta ja käsittelee kohteen Basic-haasteen. Se ei määritä proxyn todennusta.

Jos myös proxy vaatii kirjautumisen, valitse tuettu proxyn todennusjärjestely erikseen. 407 CONNECTin aikana tapahtuu ennen kuin kohde voi esittää oman haasteensa. Verkkosivuston tunnusten lisääminen salasananhallintaan ei voi täyttää tuota aiempaa vaihtoa.

opener.open() suoraan kutsuminen pitää kokoonpanon toiminnon yhteydessä. Moduulitason oletusta ei tarvitse muuttaa, ellei sovellus tarkoituksella halua kaikkien mukavuuskutsujen jakavan tätä openeria.

Aiheeseen liittyvät artikkelit