Requests PreparedRequest och saknade miljöinställningar
Håll egna förberedda begäranden förenliga med Requests vanliga proxy- och CA-hantering utan att anta att alla send-anrop på låg nivå ignorerar proxyer.
En begäran kan fungera genom session.get() och misslyckas med certifikatverifiering efter omskrivning till PreparedRequest. Send-vägen på låg nivå kör inte samma miljösammanslagning som den vanliga request-metoden.
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)
Slå samman med den slutliga förberedda URL:en efter avsedda URL-ändringar. Beslut om proxy och undantag beror på destinationen, så inställningar från en tidigare URL kan vara fel för den begäran som faktiskt skickas.
CA-inställningen är lätt att missa
Med normalt miljöförtroende aktiverat tar sammanslagningen hänsyn till REQUESTS_CA_BUNDLE och dess reserv CURL_CA_BUNDLE när verifiering inte uttryckligen åsidosatts. Ett direkt send-anrop med standard-verify gör inte den CA-sökningen. Att stänga av verifiering döljer skillnaden i stället för att ange avsett certifikatlager.
Session.prepare_request() tillämpar också sessionens förberedelsebeteende. Att skapa en begäran direkt med Request.prepare() är ett separat val; förvänta dig inte att sessionskakor eller annan sessionsförberedelse tillämpas automatiskt.
Proxyer har en mer specifik regel
Det vore fel att säga att alla PreparedRequest ignorerar proxymiljövariabler. I Requests 2.34.2 löser send proxyernas standardvärden när nyckelordsargumentet proxies saknas. Att ge proxies={} till send hoppar över just den grenen.
Den tomma ordlista som ges till merge_environment_settings har en annan roll: sammanslagningen kan fylla den med tillämpliga miljövägar innan den skickas till send. Att bara se en tom ordlista i två kodbitar missar de olika mottagande metoderna.
Håll förberedelse, miljösammanslagning och sändning tillsammans i egen kod som bygger begäranden. När applikationen avsiktligt använder trust_env=False respekterar sammanslagningen den policyn; den tvingar inte miljöinställningar på en klient som medvetet stängt av dem.