Une requête peut fonctionner via session.get() puis échouer à la vérification du certificat après réécriture en PreparedRequest. Le chemin send de bas niveau n’exécute pas la même fusion d’environnement que la méthode request normale.

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)

Fusionnez avec l’URL préparée finale, après les changements d’URL prévus. Les décisions de proxy et d’exclusion dépendent de la destination ; les réglages obtenus pour une ancienne URL peuvent être incorrects pour la requête réellement envoyée.

Le réglage CA est facile à oublier

Avec la confiance normale dans l’environnement activée, la fusion considère REQUESTS_CA_BUNDLE et son repli CURL_CA_BUNDLE lorsque la vérification n’a pas été explicitement remplacée. Appeler send directement avec verify par défaut n’effectue pas cette recherche CA. Désactiver la vérification masque l’écart au lieu de fournir le magasin de certificats voulu.

Session.prepare_request() applique aussi le comportement de préparation de la session. Créer directement une requête avec Request.prepare() est un autre choix ; n’attendez pas l’application automatique des cookies de session ou d’autres préparations de session.

Les proxys suivent une règle plus précise

Il serait inexact de dire que toute PreparedRequest ignore les variables d’environnement proxy. Dans Requests 2.34.2, send résout les proxys par défaut quand son argument nommé proxies est absent. Fournir proxies={} à send saute cette branche précise de résolution.

Le dictionnaire vide passé à merge_environment_settings a un autre rôle : la fusion peut le remplir avec les chemins d’environnement applicables avant de le transmettre à send. Se focaliser sur un dictionnaire vide dans deux extraits fait manquer les méthodes différentes qui le reçoivent.

Dans le code personnalisé de construction de requêtes, gardez ensemble préparation, fusion d’environnement et envoi. Si l’application utilise volontairement trust_env=False, la fusion respecte cette politique ; elle ne force pas l’environnement dans un client qui l’a délibérément désactivé.

Articles similaires