SW개발/파이썬

[python] requests시에 프락시 서버 설정하는 방법 + no proxy 설정하는 방법

world class product 2022. 3. 10. 13:20

본 페이지에서는 파이선 requests에 프락서 서버 설정을 해주는 방법에 대해서 설명하고자 합니다. 또한, 호환성을 위해서 no proxy 설정을 해 주는 방법에 대해서도 기술하고자 합니다.

 

 

회사 네트워크의 프락시 문제 발생

 

회사 사무실을 옮기면서 이런저런 네트워크 문제가 발생했습니다. 그중에서 가장 성가신 문제는 바로 프락시 설정 관련입니다. 사무실의 사내망 네트워크가 안정화될 때까지 부득이하게 수동으로 프록시 설정을 해줘야 불상사가 발생했습니다. 윈도우즈든 리눅스든 OS의 프락시 수동 설정은 큰 어려움이 없었습니다.

 

하지만 GitHub 서버에 접속하는 것은 OS의 프록시 설정으로도 불충분한 문제가 추가로 발생했습니다. 이 때문에 git 설정에도 아래와 같이 프락시 설정을 해줘야 했습니다. 아래와 같이 git config 명령을 통해서 큰 어려움 없이 프락시 설정을 해줄 수 있었습니다.

 

$ git config --global http.proxy "http://ABC.DEF.GHI.JKL:8080"
$ git config --global https.proxy "https://ABC.DEF.GHI.JKL:8080"

 

위와 같이 설정한 이후에 git config 명령을 수행시켜보면 proxy 설정이 제대로 되어 있는 것을 확인할 수 있습니다.

$ git config --global -l
http.proxy=http://ABC.DEF.GHI.JKL:8080
https.proxy=https://ABC.DEF.GHI.JKL:8080

 

또는 홈 디렉토리의 .git-config 라는 파일을 열어서 확인해보는 방법도 있습니다.

$ cat ~/.gitconfig
[http]
        proxy = http://ABC.DEF.GHI.JKL:8080
[https]
        proxy = https://ABC.DEF.GHI.JKL:8080

 

위의 과정으로 OS의 프락시 설정 뿐만 아니라 Git의 프락시 설정을 무사히 마칠 수 있었습니다.

 

 

python requests 시에 프락시 오류 발생

 

위의 방법으로 GitHub 접속시에 발생하는 프락시 문제를 모두 수정했다고 생각했습니다. 모두가 행복한 시간은 그리 오래가지 않았습니다. 제가 기존에 작성해서 배포했던 파이선 스크립트에서 소켓 에러가 발생한다는 제보가 접수되었습니다.

 

로그를 살펴보면 아래아 같은 로그들이 목격됩니다.

  • socket.gaierror: [Errno -2] Name or service not known
  • urllib3.exceptions.NewConnectionErrr: <urllib3.connection.VerifiedHTTPSConnection object at 0xABCDF>! Failed to establish a new connection
  • raise MaxRetryError(_pool, url, erroror ResponseError(cause))
  • urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='github', port=443): Max retries exceed with url: /api/v3/repos/user/repo/contents (Caused by ProxyError('Cannot connect to proxy.'

 

지긋지긋한 프락시 설정 문제가 제가 작성한 파이선 스크립트에도 발생한 것을 확인할 수 있습니다.

 

 

python requests에 프락시 설정 해주는 방법

 

파이선의 requests를 이용해서 웹서버와 통신시에 프락시 설정을 해주는 방법은 크게 어렵지 않습니다. 아래는 스크립트에 하드 코딩하는 방식으로 프락시 설정을 해주는 파이선 코드 예제입니다.

 

proxyDict = {
    "http" : "ABC.DEF.GHI.JKL:8080"
    "https" : "ABC.DEF.GHI.JKL:8080"
    }

file = req.get(url, proxies=proxyDict)

 

위와 같이 reqeusts.get 구문에 프록시 설정을 추가해주면 깔끔하게 해결됩니다. 하지만 위의 방법을 스크립트에 프락시 설정이 하드 코딩되어 들어가므로 이후에 프락시 설정이 불필요해지거나 또 다른 프락시 서버를 이용해야 할 때 스크립트 수정이 필요하기 때문에 좋은 코딩 방법이 아닙니다.

 

http_proxy = 'None'
https_proxy = 'None'

for i in range( 1, len(sys.argv) ):
    if "-http_proxy=" in sys.argv[i]:
        http_proxy = sys.argv[i][0:12:]
    elif "-https_proxy=" in sys.argv[i]:
        https_proxy = sys.argv[i][0:13:]
        
proxyDict = {
    "http" : http_proxy
    "https" : https_proxy
    }

file = req.get(url, proxies=proxyDict)

 

위와 같이 코딩하면 파이선 스크립트 수행시에 실행 인자로 프록시 옵션을 주면 해당 프록시 서버를 이용하고, 그렇지 않을 경우에는 No proxy 모드로 동작하게 됩니다.

 

$ sudo python3 my_script.py

위와 같이 실행시에 프락시 옵션 업이 파이선 스크립트를 수행시키면 No proxy 모드로 동작합니다.

 

$ python3 my_script.py -http_proxy="abc.def.ghi.jkl:8080" -https_proxy="abc.def.ghi.jkl:8080"

프락시 설정이 필요할 경우 파이선 스크립트 실행 시에 위와 같은 옵션을 주면 해당 프록시를 사용한 상태로 스크립트가 수행되게 됩니다.

 

위와 같이 프락시 설정을 실행 인자로 넣어주는 방법도 있겠지만, 더 좋은 방법은 환경 변수에 등록된 프락시 설정을 파이선에서 읽어와서 자동으로 처리하게 해 주면 더욱 좋겠지요?

 

 

이상입니다.