Python urllib: kunigi prokuran enkursigon kun Basic-autentikigo de retejo
Kunigu urllib-enkursigon kaj Basic-autentikigon de la celo en unu eksplicita opener, sen dufoje anstataŭigi la tutmondan opener-on.
Voki install_opener() dufoje ne aldonas la duan opener al la unua. Ĝi anstataŭigas la implicitan opener de la modulo. Se unu objekto konas la prokurilon kaj alia la retejan saluton, konstruu unu opener kun la bezonataj handler-oj.
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()La prokurilo kaj la celo estas ekzemploj. Por publika servo atingebla per publika HTTP-prokurilo, la listo de HTTP-prokuriloj provizas kandidatajn finpunktojn por la enkursiga handler-o. Ĉi tiu opener enkursigas la HTTPS-peton tra la HTTP-prokurilo kaj traktas la Basic-defion de la celo. Ĝi ne agordas prokurilan aŭtentikigon.
Se ankaŭ la prokurilo postulas saluton, elektu subtenatan prokurilan aŭtentikigan aranĝon aparte. 407 ĉe CONNECT okazas antaŭ ol la celo povas eldoni sian propran defion. Aldoni retejajn legitimilojn al la pasvorta administranto ne povas kontentigi tiun pli fruan interŝanĝon.
Rekta vokado de opener.open() tenas la agordon kun la operacio. Ne necesas ŝanĝi la modul-nivelan implicitan valoron, krom se la aplikaĵo intence volas, ke ĉiuj oportunaj vokoj kunhavigu ĉi tiun opener-on.