Ang pagtawag sa install_opener() nang dalawang beses ay hindi nagdaragdag ng pangalawang opener sa una. Pinapalitan nito ang default opener ng module. Kung alam ng isang object ang proxy at ng isa pa ang login sa website, bumuo ng isang opener na may mga kinakailangang handler.

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

Ang proxy at destinasyon ay mga halimbawa. Para sa pampublikong serbisyo na maaaring maabot sa pamamagitan ng pampublikong HTTP proxy, ang listahan ng HTTP proxy ay nagbibigay ng mga kandidatong endpoint para sa routing handler. Ang opener na ito ay nagruruta ng HTTPS request sa HTTP proxy at humahawak sa Basic challenge ng destinasyon. Hindi nito kinokonfigura ang authentication ng proxy.

Kung kailangan din ng login ang proxy, pumili ng suportadong kaayusan ng proxy-authentication nang hiwalay. Ang 407 sa oras ng CONNECT ay nangyayari bago pa makapaglabas ang destinasyon ng sarili nitong challenge. Ang pagdaragdag ng mga kredensyal ng website sa password manager ay hindi makakasagot sa naunang palitan.

Ang direktang pagtawag sa opener.open() ay nagpapanatili ng configuration kasama ng operasyon. Hindi kailangang baguhin ang module-wide default maliban kung sadyang nais ng application na lahat ng maginhawang tawag ay magbahagi ng opener na ito.

Kaugnay na mga artikulo