Il proxy dell'ufficio chiede un account. Il sito web dietro ne chiede un altro. Requests ha input separati per questi due login Basic: le credenziali nell'URL del proxy e l'argomento auth della richiesta.

from urllib.parse import quote
import requests

proxy_url = (
    f"http://{quote(proxy_user, safe='')}:"
    f"{quote(proxy_password, safe='')}@proxy.example:8080"
)
response = requests.get(
    "https://reports.example/private/",
    proxies={"https": proxy_url},
    auth=(site_user, site_password),
    timeout=(5, 20),
)
response.raise_for_status()

Le quattro variabili dell'account provengono dalla configurazione delle credenziali dell'applicazione. Codificare separatamente nome utente e password del proxy conserva caratteri come la chiocciola senza trasformarli in delimitatori dell'URL.

La chiave https del dizionario seleziona questa rotta per una destinazione HTTPS. Il suo valore inizia ancora con http:// perché è il protocollo usato per raggiungere questo proxy di esempio.

In quella richiesta HTTPS, il login del proxy appartiene allo scambio CONNECT. Il login del sito appartiene alla richiesta successiva attraverso il tunnel stabilito. Lasciare che l'adapter ricavi l'autorizzazione del proxy dal proprio URL la mantiene sul salto pertinente; per questo caso Basic non serve alcuna classe di autenticazione combinata.

Un 407 segnala la sfida dell'intermediario. Un 401 dal sito segnala la sfida della destinazione. Usa quella risposta per decidere quale dei due account configurati richiede attenzione.

Articoli correlati