Python urllib: proxy maršrutizavimo sujungimas su svetainės Basic autentifikavimu
Sujunkite urllib maršrutizavimą ir paskirties vietos Basic autentifikavimą viename aiškiame opener, nepakeisdami globalaus opener du kartus.
Iškviečiant install_opener() du kartus, antrasis opener nepridedamas prie pirmojo. Jis pakeičia modulio numatytąjį opener. Jei vienas objektas žino proxy, o kitas — svetainės prisijungimą, sukurkite vieną opener su reikiamais handlers.
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 ir paskirties vieta yra pavyzdžiai. Viešajai paslaugai, pasiekiamai per viešą HTTP proxy, HTTP proxy sąrašas pateikia kandidatų endpointus maršrutizavimo handleriui. Šis opener nukreipia HTTPS užklausą per HTTP proxy ir apdoroja paskirties vietos Basic iššūkį. Jis nekonfigūruoja proxy autentifikavimo.
Jei proxy taip pat reikalauja prisijungimo, atskirai pasirinkite palaikomą proxy autentifikavimo tvarką. 407 CONNECT metu įvyksta anksčiau, nei paskirties vieta gali išduoti savo iššūkį. Svetainės kredencialų pridėjimas prie slaptažodžių tvarkyklės negali patenkinti to ankstesnio mainų.
Tiesioginis opener.open() iškvietimas išlaiko konfigūraciją kartu su operacija. Nereikia keisti modulio lygio numatytojo nustatymo, nebent programa sąmoningai nori, kad visi patogūs iškvietimai naudotų šį opener.