Requests PreparedRequest og manglende miljøindstillinger
Hold egne forberedte forespørgsler i tråd med Requests’ normale proxy- og CA-håndtering uden at antage, at alle send-kald på lavt niveau ignorerer proxyer.
En forespørgsel kan virke gennem session.get() og fejle ved certifikatkontrol efter omskrivning til PreparedRequest. Send-stien på lavt niveau udfører ikke samme miljøsammenfletning som den normale request-metode.
import requests
with requests.Session() as session:
request = requests.Request("GET", "https://example.com/")
prepared = session.prepare_request(request)
settings = session.merge_environment_settings(
prepared.url, {}, None, None, None
)
response = session.send(
prepared,
timeout=(5, 15),
**settings,
)
response.raise_for_status()
print(response.status_code)
Flet med den endelige forberedte URL efter de tilsigtede URL-ændringer. Proxy- og omgåelsesbeslutninger afhænger af destinationen, så indstillinger fra en tidligere URL kan være forkerte for den forespørgsel, du faktisk sender.
CA-indstillingen er let at overse
Med normal miljøtillid aktiveret tager sammenfletningen højde for REQUESTS_CA_BUNDLE og dens reserve CURL_CA_BUNDLE, når kontrollen ikke udtrykkeligt er overstyret. Et direkte send-kald med standard-verify udfører ikke dette CA-opslag. At slå kontrol fra skjuler forskellen i stedet for at angive det tilsigtede certifikatlager.
Session.prepare_request() anvender også sessionens forberedelsesadfærd. At oprette en forespørgsel direkte med Request.prepare() er et særskilt valg; forvent ikke, at det automatisk anvender sessionscookies eller anden sessionsforberedelse.
Proxyer har en mere præcis regel
Det er upræcist at sige, at alle PreparedRequest ignorerer proxymiljøvariabler. I Requests 2.34.2 finder send proxyens standardværdier, når nøgleordsargumentet proxies mangler. Hvis du giver proxies={} til send, springes netop den standardopløsningsgren over.
Den tomme dictionary givet til merge_environment_settings har en anden rolle: sammenfletningen kan fylde den med relevante miljøruter, før den sendes videre til send. Hvis man kun ser en tom dictionary i to eksempler, overser man de forskellige metoder, der modtager den.
Hold forberedelse, miljøsammenfletning og afsendelse samlet i egen forespørgselskode. Når applikationen bevidst bruger trust_env=False, respekterer sammenfletningen den politik; den tvinger ikke miljøindstillinger ind i en klient, der bevidst har deaktiveret dem.