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 자체의 병합 동작을 확정할 수 없습니다.

관련 글