본문 바로가기

Software Engineering/Python

Python requests 패키지 proxy 설정에 관한 정리

(참고 문서) https://docs.python-requests.org/en/latest/user/advanced/#proxies

NO_PROXY 설정하기

  • requests 패키지는 NO_PROXY 환경 변수를 참조하여 프록시를 우회 한다.
  • Dockerfile에서 NO_PROXY 환경 변수가 설정 된 경우 해당 값을 참조한다.
  • requests 패키지는 no_proxy에서 스킴(http/https)을 지원하지 않기 때문에 Dockerfile에서 스킴을 구분하여 환경 변수를 설정하더라도 구분하여 적용되지 않는다. no_proxy 환경 변수에서는 도메인, IP 주소만 인식한다.
import os
import requests

# 스킴 구분은 지원되지 않음
os.environ['NO_PROXY'] = 'http://example.com,https://secure.example.com'

# HTTP 요청
response = requests.get('http://example.com')  # NO_PROXY가 적용되지 않음
print(response.status_code)
  • requests 패키지는 no_proxy 환경 변수에서 와일드 카드를 완벽하지 지원하지 않는다. 서브 도메인을 지정할 때는 명시적으로 지정해야 한다.
import os
import requests

# 와일드카드 도메인은 완벽히 지원되지 않을 수 있음
os.environ['NO_PROXY'] = '*.example.com'

# 특정 서브도메인을 명시적으로 설정하는 것이 권장됨
os.environ['NO_PROXY'] = 'sub.example.com,another.example.com'

# HTTP 요청
response = requests.get('http://sub.example.com')
print(response.status_code)
  • python 파일 내부에서 no_proxy 환경 변수를 설정하는 경우 해당 값이 우선 적용된다. 이 값은 기존 환경 변수에 추가되지 않고 덮어써진다.
  • response 값에서 실제 request 요청 시 어떤 proxy를 사용하였는지 확인 할 수 있다.
response = requests.get('http://example.com')
print('Request URL:', response.url)
print('Effective proxies:', response.request.proxies)
  • 사용된 no_proxy 설정은 환경 변수를 읽어서 확인할 수 있다.
no_proxy = os.environ.get('NO_PROXY', os.environ.get('no_proxy'))
print('NO_PROXY:', no_proxy)