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.

Articole similare