Wywołanie install_opener() dwa razy nie dodaje drugiego openera do pierwszego. Zastępuje domyślny opener modułu. Jeśli jeden obiekt zna proxy, a inny — logowanie do witryny, zbuduj jeden opener z wymaganymi handlerami.

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 i miejsce docelowe to przykłady. Dla usługi publicznej osiągalnej przez publiczne proxy HTTP lista proxy HTTP dostarcza kandydatów na endpointy dla handlera routingu. Ten opener kieruje żądanie HTTPS przez proxy HTTP i obsługuje wyzwanie Basic miejsca docelowego. Nie konfiguruje uwierzytelniania proxy.

Jeśli proxy również wymaga logowania, wybierz osobno obsługiwany układ uwierzytelniania proxy. 407 w momencie CONNECT występuje, zanim miejsce docelowe może wydać własne wyzwanie. Dodanie danych witryny do menedżera haseł nie zaspokoi tej wcześniejszej wymiany.

Bezpośrednie wywołanie opener.open() zachowuje konfigurację razem z operacją. Nie trzeba zmieniać ustawienia domyślnego całego modułu, chyba że aplikacja celowo chce, aby wszystkie wygodne wywołania współdzieliły ten opener.

Powiązane artykuły