Eine Anfrage kann über session.get() funktionieren und nach dem Umschreiben als PreparedRequest bei der Zertifikatsprüfung scheitern. Der niedrigere send-Pfad führt nicht dieselbe Zusammenführung der Umgebung wie die normale request-Methode aus.

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)

Führe die Zusammenführung mit der endgültigen vorbereiteten URL nach allen beabsichtigten URL-Änderungen aus. Proxy- und Umgehungsentscheidungen hängen vom Ziel ab; für eine frühere URL ermittelte Einstellungen können für die tatsächlich gesendete Anfrage falsch sein.

Die CA-Einstellung wird leicht übersehen

Bei aktiviertem normalem Umgebungsvertrauen berücksichtigt die Zusammenführung REQUESTS_CA_BUNDLE und dessen Rückfall CURL_CA_BUNDLE, sofern die Prüfung nicht ausdrücklich überschrieben wurde. Ein direkter send-Aufruf mit der standardmäßigen verify-Einstellung führt diese CA-Suche nicht durch. Das Abschalten der Prüfung verdeckt den Unterschied, statt den vorgesehenen Zertifikatsspeicher bereitzustellen.

Session.prepare_request() wendet auch das Vorbereitungsverhalten der Sitzung an. Eine Anfrage direkt mit Request.prepare() zu erstellen ist eine separate Entscheidung; erwarte nicht, dass dabei automatisch Sitzungscookies oder andere Sitzungsvorbereitungen angewendet werden.

Für Proxys gilt eine genauere Regel

Es wäre unzutreffend zu sagen, jeder PreparedRequest ignoriere Proxy-Umgebungsvariablen. In Requests 2.34.2 ermittelt send Proxyvorgaben, wenn das Schlüsselwortargument proxies fehlt. Wird proxies={} an send übergeben, entfällt genau dieser Zweig zur Vorgabenermittlung.

Das leere Dictionary an merge_environment_settings hat eine andere Rolle: Die Zusammenführung kann es mit passenden Umgebungsrouten füllen, bevor es an send weitergegeben wird. Wer nur das leere Dictionary in zwei Beispielen betrachtet, übersieht die unterschiedlichen empfangenden Methoden.

Halte in eigener Anfrageaufbau-Logik Vorbereitung, Umgebungszusammenführung und Versand beieinander. Verwendet die Anwendung absichtlich trust_env=False, respektiert die Zusammenführung diese Vorgabe; sie erzwingt keine Umgebungseinstellungen bei einem Client, der sie bewusst deaktiviert hat.

Ähnliche Artikel