Python urllib: łączenie routingu proxy z Basic Authentication witryny
Połącz routing urllib i Basic authentication miejsca docelowego w jednym jawnym openerze, bez dwukrotnego zastępowania globalnego openera.
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.