session.proxies がある接続先を指しているのにスクリプトがシェルのプロキシを使う場合、同じ辞書を代入し直しても競合は解消しません。Requests は環境のプロキシ設定を Session の既定値に優先してマージすることがあります。Session に環境からの設定検出を続けさせるか決めてください。

環境からの検出を残し、リクエストで経路を指定する

この Session と環境の競合を避ける方法として Requests が推奨するとおり、個々の呼び出しに明示的な値を渡します。

proxies = {
    "http": "http://127.0.0.1:8080",
    "https": "http://127.0.0.1:8080",
}

with requests.Session() as session:
    response = session.get(
        "https://example.com/",
        proxies=proxies,
        timeout=(5, 15),
    )
    response.raise_for_status()

ローカルの待ち受け先を自分のものに置き換えます。公開 HTTP 接続先を比較するなら、Session の方針を固定してHTTP プロキシ一覧から候補を選びます。これで制御されるのは渡したマッピングの項目です。アプリケーションが使う他のスキームやホストについても意識して選択してください。サービス、IDE、コンテナー、CI ランナーが継承する環境は端末と異なる場合があります。

Session 自身に設定を管理させる

アプリケーションが環境からプロキシを検出すべきでない場合は、最初のリクエスト前に方針を設定します。

with requests.Session() as session:
    session.trust_env = False
    session.proxies = {
        "http": "http://127.0.0.1:8080",
        "https": "http://127.0.0.1:8080",
    }
    response = session.get(
        "https://example.com/",
        timeout=(5, 15),
    )
    response.raise_for_status()

trust_env=False は、環境に関連する証明書設定や netrc による自動認証にも影響します。選択前にこれらの依存関係を考慮してください。承認済みのプライベート CA バンドルには、明示的なパスを渡せます。

response = session.get(
    "https://example.com/",
    timeout=(5, 15),
    verify="/path/to/approved-ca-bundle.pem",
)

実際に承認されたバンドルを使い、検証は有効のままにします。他の処理が使っている Session を変更せず、経路の方針ごとに別の Session を保持してください。

どちらの方法でもアプリケーションの経路を説明できない場合、同じ実行環境と無害な宛先で、分離した Session とアプリケーションを比較します。存在するプロキシ変数、trust_env の値、呼び出しが proxies を渡すかを記録し、共有ログに認証情報入り URL を残さないでください。分離した場合だけ成功するなら、次に Session の構築、アダプター、準備済みリクエストの処理経路、独自のトランスポートを調べます。curl で環境を試しても Requests 自身のマージ動作は確定できません。

関連記事