Requests PreparedRequest a chybějící nastavení prostředí
Udržujte vlastní připravené požadavky v souladu s běžnou správou proxy a CA v Requests, bez předpokladu, že každý nízkoúrovňový send ignoruje proxy.
Požadavek může fungovat přes session.get() a po přepsání na PreparedRequest selhat při ověřování certifikátu. Nízkoúrovňová cesta send neprovádí stejné sloučení prostředí jako běžná metoda request.
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)
Sloučení provádějte s konečným připraveným URL po zamýšlených změnách. Rozhodování o proxy a obcházení závisí na cíli, takže nastavení získané pro dřívější URL může být pro skutečně odeslaný požadavek chybné.
Nastavení CA se snadno přehlédne
Při běžně zapnuté důvěře v prostředí sloučení zohlední REQUESTS_CA_BUNDLE a náhradní CURL_CA_BUNDLE, pokud nebylo ověřování výslovně přepsáno. Přímé volání send s výchozím verify tuto CA nezjišťuje. Vypnutí ověřování rozdíl skryje místo dodání zamýšleného úložiště certifikátů.
Session.prepare_request() uplatňuje i přípravné chování relace. Přímé vytvoření požadavku přes Request.prepare() je jiná volba; neočekávejte automatické použití cookies relace nebo jiné přípravy relace.
Proxy mají konkrétnější pravidlo
Bylo by nepřesné tvrdit, že každý PreparedRequest ignoruje proměnné prostředí proxy. V Requests 2.34.2 send určuje výchozí proxy, pokud chybí klíčový argument proxies. Předání proxies={} do send přeskočí tuto konkrétní větev určení výchozích hodnot.
Prázdný slovník předaný do merge_environment_settings má jinou roli: sloučení jej může naplnit vhodnými trasami z prostředí před předáním do send. Pouhý výskyt prázdného slovníku ve dvou ukázkách zastírá různé metody, které jej přijímají.
Ve vlastním kódu pro sestavování požadavků držte přípravu, sloučení prostředí a odeslání pohromadě. Když aplikace záměrně používá trust_env=False, sloučení tuto politiku respektuje; není to způsob vynucení prostředí klientovi, který je úmyslně vypnul.