Python urllib: combinarea rutării proxy cu Basic Authentication a site-ului
Combinați rutarea urllib și Basic authentication a destinației într-un singur opener explicit, fără a înlocui openerul global de două ori.
Apelarea install_opener() de două ori nu adaugă al doilea opener la primul. Înlocuiește openerul implicit al modulului. Dacă un obiect cunoaște proxy-ul, iar altul autentificarea pe site, construiți un singur opener cu handler-ele necesare.
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-ul și destinația sunt exemple. Pentru un serviciu public accesibil printr-un proxy HTTP public, lista de proxy-uri HTTP oferă endpoint-uri candidate pentru handler-ul de rutare. Acest opener direcționează cererea HTTPS prin proxy-ul HTTP și tratează provocarea Basic a destinației. Nu configurează autentificarea proxy-ului.
Dacă și proxy-ul cere autentificare, alegeți separat o schemă de autentificare proxy acceptată. Un 407 la momentul CONNECT apare înainte ca destinația să-și poată emite propria provocare. Adăugarea acreditărilor site-ului în managerul de parole nu poate satisface acel schimb anterior.
Apelarea directă a opener.open() păstrează configurația împreună cu operația. Nu este nevoie să modificați implicitul la nivel de modul decât dacă aplicația dorește în mod deliberat ca toate apelurile comode să partajeze acest opener.