์๋
ํ์ธ์,
์๋ฅผ ๋ค์ด:
>>> requests.get('http://localhost:1111')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "requests/api.py", line 55, in get
return request('get', url, **kwargs)
File "requests/api.py", line 44, in request
return session.request(method=method, url=url, **kwargs)
File "requests/sessions.py", line 312, in request
resp = self.send(prep, **send_kwargs)
File "requests/sessions.py", line 413, in send
r = adapter.send(request, **kwargs)
File "requests/adapters.py", line 223, in send
raise ConnectionError(e)
requests.exceptions.ConnectionError: HTTPConnectionPool(host='localhost', port=1111): Max retries exceeded with url: / (Caused by <class 'socket.error'>: [Errno 61] Connection refused)
(ํฌํธ 1111์์ ์์ ๋๊ธฐ ์ค์ธ ํญ๋ชฉ์ด ์๋ค๊ณ ๊ฐ์ )
์์ธ๋ "์ต๋ ์ฌ์๋๋ฅผ ์ด๊ณผํ์ต๋๋ค"๋ผ๊ณ ํ์๋ฉ๋๋ค. ์ฌ์๋ ๊ด๋ จ ๋งค๊ฐ๋ณ์๋ฅผ ์ง์ ํ์ง ์์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ด ํผ๋์ค๋ฝ๋ค๋ ๊ฒ์ ์์์ต๋๋ค. ์ฌ์ค, ์ฌ์๋ ํ์ ์ง์ ์ ๋ํ ๋ฌธ์๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค. ์ฝ๋๋ฅผ ์ดํด๋ณธ ํ urllib3์ด ๊ธฐ๋ณธ ์ ์ก์ธ ๊ฒ์ผ๋ก ๋ณด์ด๋ฉฐ max_retries=0์ผ๋ก ํธ์ถ๋ฉ๋๋ค(์ฌ์ค ์ฌ์๋๊ฐ ์์ต๋๋ค). ์์ฒญ์ ๋จ์ํ ์์ธ๋ฅผ ๋ํํฉ๋๋ค. ๊ทธ๋์ ์ดํดํ ์ ์์ง๋ง ์ต์ข ์ฌ์ฉ์(์ต์ข ๊ฐ๋ฐ์)๋ฅผ ํผ๋์ค๋ฝ๊ฒ ํฉ๋๊น? ํนํ ์ด ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ ๋งค์ฐ ์ฝ๋ค๋ ์ ์ ๊ณ ๋ คํ๋ฉด ์ฌ๊ธฐ์ ๋ ๋์ ์์ ์ ์ํํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์์ฒญ์ ์ฌ์ฉ์ ํธ์๋ฅผ ์ํด ์์ธ๋ฅผ ๋ํํฉ๋๋ค. Traceback์ด ์คํด์ ์์ง๊ฐ ์์ง๋ง ์๋ ์์ธ๋ ๋ฉ์์ง์ ์ผ๋ถ์ ๋๋ค. ์ด๋ฅผ ๊ฐ์ ํ๋ ๋ฐฉ๋ฒ์ ์๊ฐํ๊ฒ ์ต๋๋ค.
๋ช ๊ฐ์ง ์ค๋ฅ๋ฅผ ๋ฌด์ํ๋ ค๋ฉด ์๋ ์ฌ์๋๊ฐ ํ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋๋ ์ด๊ฒ์ด ์๋นํ ํผ๋์ค๋ฝ๋ค๋ ๊ฒ์ ๋์ํฉ๋๋ค. ์์ฒญ์ ์ ๋ ์ฌ์๋ํ์ง ์์ผ๋ฏ๋ก(urllib3์ HTTPConnectionPool์ ๋ํด retries=0์ผ๋ก ์ค์ ) HTTPConnectionPool/MaxRetryError ํญ๋ชฉ์ด ์์ผ๋ฉด ์ค๋ฅ๊ฐ ํจ์ฌ ๋ ๋ช ํํด์ง๋๋ค. ์ผ๋ง๋ ๋ง์ ์ฌ์๋๋ฅผ ์ํํ๋์ง ์์๋ด๊ธฐ ์ํด ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์์ค ์ฝ๋๋ฅผ ์ดํด๋ด์ผ ํ๋ ์ง๊ธ๊น์ง ์์ฒญ์ด urllib3๋ฅผ ์ฌ์ฉํ๋ค๋ ์ฌ์ค์ ๊นจ๋ซ์ง ๋ชปํ์ต๋๋ค.
ConnectionError(MaxRetryError("HTTPSConnectionPool(host='api.venere.com', port=443): \
Max retries exceeded with url: /xhi-1.0/services/XHI_HotelAvail.json (\
Caused by <class 'socket.error'>: [Errno 10054] \
An existing connection was forcibly closed by the remote host)",),)
์ด์์ ์ผ๋ก ์์ธ๋ ๋ค์๊ณผ ๊ฐ์ด ๋ณด์ผ ๊ฒ์ ๋๋ค.
ConnectionError(<class 'socket.error'>: [Errno 10054] \
An existing connection was forcibly closed by the remote host))
์ด์์ ์ผ ๊ฒ์ ๋๋ค. ๋ฌธ์ ๋ ์ฐ๋ฆฌ์ฒ๋ผ ์ด๋ฌํ ์์ธ๋ฅผ ๋ํํ๋ ๊ฒ์ ๋๋ค. ํ๋ฅญํ API๋ฅผ ์ ๊ณตํ์ง๋ง ๋๋ฒ๊น ํ๊ฒฝ์ ์ข์ง ์์ต๋๋ค. ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ๋ชจ๋ ์ ๋ณด๋ฅผ ๋ณด์กดํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์์ด๋์ด๊ฐ ์์ต๋๋ค.
์ฐ๋ฆฌ๋ ๋ํ ์ฌ์ฉ์๊ฐ configure _does_ ์ฌ์๋ํ๋ ๊ฒฝ์ฐ๋ฅผ ๊ณ ๋ คํด์ผ ํฉ๋๋ค. ์ด ๊ฒฝ์ฐ ์ด ์์ธ๊ฐ ์ ์ ํฉ๋๋ค.
@Lukasa , ๋๋ ๋น์ ์ด ๊ทธ๊ฒ์ ๊ณ ๋ คํ ํ์๊ฐ ์๋์ง ํ์ ํ์ง ๋ชปํฉ๋๋ค. Kenneth๋ ์ฌ๊ธฐ์ Requests๊ฐ API์ ์ผ๋ถ๋ก ์ฌ์๋๋ฅผ ๋ช ์์ ์ผ๋ก ์ง์ํด์๋ ์ ๋๋ค๊ณ ๋งํ์ต๋๋ค.
๋ง์ต๋๋ค. ํ์ง๋ง ์ฌ์ฉ์๊ฐ ์ค์ ๋ก ๊ทธ๋ ๊ฒ ํ๋ ๊ฒ์ ๋ง์ ๋ฐฉ๋ฒ์ ์์ต๋๋ค.
๊ธฐ๋ก์ ์ํด ๋ด ๊ณํ์ ๊ฐ์ฅ ๋ฎ์ ์์ค์ ์์ธ๊น์ง ๊ฐ๋ฅํ ํ ์๋์ชฝ์ผ๋ก ํก๋จํ์ฌ ๋์ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค. @benhoyt ์์ ์ ๋ฌธ์ ์ ์ ์์ผ ์ค๋ฅ ์์ธ๋ฅผ ์ฌ์ฉํ ์ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. (๋ถ์ฌ๋์ ๊ฒ๋ง ๋ด๋.. ์์ง ์ฌํํด์ ๊ฐ์ง๊ณ ๋์๋ณด์ง ๋ชปํ์ด์.)
@gabor ์ ์์ ๋ ์ค์ ๋ก ์ด๊ฒ์ ์ฌํํ๊ธฐ ์ฝ๊ฒ ๋ง๋ญ๋๋ค. ๋ฐ์ํ ์์ธ๋ฅผ ํฌ์ฐฉํ์ฌ ๋ค์์ ์ํํ์ต๋๋ค.
>>> e
ConnectionError(MaxRetryError("HTTPConnectionPool(host='localhost', port=1111): Max retries exceeded with url: / (Caused by <class 'socket.error'>: [Errno 111] Connection refused)",),)
>>> e.args
(MaxRetryError("HTTPConnectionPool(host='localhost', port=1111): Max retries exceeded with url: / (Caused by <class 'socket.error'>: [Errno 111] Connection refused)",),)
>>> e.args[0].args
("HTTPConnectionPool(host='localhost', port=1111): Max retries exceeded with url: / (Caused by <class 'socket.error'>: [Errno 111] Connection refused)",)
>>> e.args[0].args[0]
"HTTPConnectionPool(host='localhost', port=1111): Max retries exceeded with url: / (Caused by <class 'socket.error'>: [Errno 111] Connection refused)"
>>> isinstance(e.args[0].args[0], str)
True
๋ฐ๋ผ์ ์ฐ๋ฆฌ๊ฐ ํ ์ ์๋ ์ต์ ์ e.args[0].args[0]
์ ์ฅ๋ ๋ฉ์์ง๋ง ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค. ์ด ๋ฉ์์ง๋ ์ ์ฌ์ ์ผ๋ก ํผ๋์ค๋ฌ์ธ ์๋ ์์ง๋ง @benhoyt ๊ฐ ๋ํ ๊ฒ์
๋๋ค. ์ด๋ ์ชฝ์ด๋ , ์ฐ๋ฆฌ๋ ๋ ๋ง๊ฑฐ๋ ์ ์ ์ธ๋ถ ์ฌํญ์ ์ป์ผ๋ ค๊ณ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ๊ตฌ๋ฌธ ๋ถ์ํ์ง ์์ ๊ฒ์
๋๋ค. ์๋ํ๋ฉด ๊ทธ๊ฑด ์์ ํ ๋ฏธ์น ์ง์ผ ๊ฒ์ด๊ธฐ ๋๋ฌธ์
๋๋ค.
@ sigmavirus24 , ์์ธ์์ ๋ฌธ์์ด ๊ตฌ๋ฌธ ๋ถ์์ด ๋์ฐํ ์๊ฐ์ด๋ผ๋ ๋ฐ ๋์ํฉ๋๋ค. ๊ทธ๋ฌ๋ urllib3์ MaxRetryError๋ ๊ธฐ๋ณธ ์์ธ๋ฅผ ํฌํจํ๋ reason
์์ฑ์ ์ด๋ฏธ ๋
ธ์ถํฉ๋๋ค( ์์ค ์ฝ๋ ์ฐธ์กฐ). ๋ฐ๋ผ์ e.args[0].reason
์ํ๋ ๊ฒ์ ์ป์ ์ ์์ต๋๋ค.
๋ฐ๋ผ์ ์์ ์๋ฅผ ๊ณ์ํ๋ฉด e.args[0].reason
๋ socket.error
์ ์ธ์คํด์ค์
๋๋ค.
>>> requests.get('http://localhost:1111')
Traceback (most recent call last):
...
requests.exceptions.ConnectionError: HTTPConnectionPool(host='localhost', port=1111): Max retries exceeded with url: / (Caused by <class 'socket.error'>: [Errno 10061] No connection could be made because the target machine actively refused it)
>>> e = sys.last_value
>>> e
ConnectionError(MaxRetryError("HTTPConnectionPool(host='localhost', port=1111): Max retries exceeded with url: / (Caused by <class 'socket.error'>: [Errno 10061] No connection could be made because the target machine actively refused it)",),)
>>> e.args[0]
MaxRetryError("HTTPConnectionPool(host='localhost', port=1111): Max retries exceeded with url: / (Caused by <class 'socket.error'>: [Errno 10061] No connection could be made because the target machine actively refused it)",)
>>> e.args[0].reason
error(10061, 'No connection could be made because the target machine actively refused it')
์ข์ ์บ์น @benhoyt. ๋๋ ์ํ๋ ๋งํผ urllib3์ ์ต์ํ์ง ์์ต๋๋ค.
๋น์ ์ด ๋ณด์ฌ์ค ๊ฒ์ฒ๋ผ ์ ๋ง ๋ณด์ธ๋ค๋ฉด.
requests.exceptions.ConnectionError: HTTPConnectionPool(host='localhost', port=1111): Max retries exceeded with url: / (Caused by <class 'socket.error'>: [Errno 61] Connection refused)
๊ทธ๋ ๋ค๋ฉด ๋๋ ๋ ๋์ ์์ธ๋ฅผ ๊ฟ๊ฟ ์ ์์์ต๋๋ค.
@piotr-dobrogost, ์ฃผ์ ๋ฌธ์ (์ ๋ฅผ ์ํด)๋ ์ฌ์๋๊ฐ ์ ํ ๊ด๋ จ๋์ง ์์ ๊ฒฝ์ฐ "์ต๋ ์ฌ์๋ ์ด๊ณผ"์ ๋ํด ์ด์ผ๊ธฐํ๋ค๋ ์ฌ์ค์ด์์ต๋๋ค. ์ฒ์์๋ ์ ๊ฐ ์ฌ์ฉํ๊ณ ์๋ ์น ์๋น์ค์ธ ์ค ์๊ณ ์ฐ๋ฝ์ ํด๋ดค์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ๋ ํ๊ณ ๋ค์ด ์ด๊ฒ์ด urllib3์ ๋จ์ ์ด๋ผ๋ ๊ฒ์ ๋ฐ๊ฒฌํ์ต๋๋ค. ๊ทธ๋์ ๋น์ ์ ํผ๋์ ๋ณผ ์ ์์ต๋๋ค.
์์ธ์ (Caused by <class 'socket.error'>: [Errno 61] Connection refused)
๋ถ๋ถ์ โโ๋์ณค์ต๋๊น?
๋ค, ๋ง์ต๋๋ค. ๋ชจ๋ ๊ฒ์ด ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ด๊ฐ ์ธ๊ธํ๋ฏ์ด MaxRetryError๋ ๋ถ์ ์ฒญ์ด์ด๊ธฐ ๋๋ฌธ์ ์ฒ์์๋ ๊ทธ๊ฒ์ ๋์ณค์ต๋๋ค.
์ด ์ต๋ ์ฌ์๋๋ ํญ์ ๋๋ฅผ ๋ฏธ์น๊ฒ ๋ง๋ญ๋๋ค. ๋ด๊ฐ ๋ฐ์ด๋ค์ด ์ฌ์๋ ๋ฉ์์ง๋ฅผ ์ค์ฟผ์ํ๊ธฐ ์ํด PR์ ํจ๊ป ๋ฃ์ ์ ์๋์ง ํ์ธํ๋ ์ฌ๋์ด ์์ต๋๊น?
๊ฐ์๊ธฐ ๋ํ๋๋ ค๋ ๊ฒ์ ์๋์ง๋ง Cloudant์์ ์ํํ๋ Python ์์ ์์ ์์ฒญ ํค์ ์ฌ์ฉํฉ๋๋ค. ์ฌ์๋ ํญ๋ชฉ์ด ํฌํจ๋ ํ์ด์ง๊ฐ ํ์๋๋ฉฐ ์ด๋ ์ฒญ์ด์ผ ์ ์์ต๋๋ค.
์ ๋ต์ _์๋ง๋_์ ๋๋ค.
๋ฌธ์ ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์๋๋ฅผ ์ํํ์ง ์์ง๋ง ์คํจํ ์์ฒญ์ ์๋์ผ๋ก ์ฌ์๋ํ๋๋ก ์์ฒญ์ ๊ตฌ์ฑํ ์ ์๋ค๋ ๊ฒ์
๋๋ค. ์ด๋ฌํ ์ํฉ์์ ์ฐ๋ฆฌ๊ฐ ํฌ์ฅํ MaxRetryError
๋ ์์ ํ ํฉ๋ฆฌ์ ์
๋๋ค. MaxRetryError
๊ฐ ์์ด์ผ ํ ๋ ์ ์๋ฆฌ์ ๋์ง๋ง ์ฌ์๋๊ฐ ์ด๋ฃจ์ด์ง์ง ์์๋ค๊ณ ๋ณด์ฅํ ์ ์์ ๋ ์ ๊ฑฐํ๋ ์๋ฃจ์
์ ์๊ฐํด๋ผ ์ ์๋ค๋ฉด ์ฐ๋ฆฌ๋ ์ด๋ฅผ ๊ณ ๋ คํ ๊ฒ์
๋๋ค. =)
@Lukasa ๊ฐ์ฌํฉ๋๋ค. ์ฌ๊ธฐ ๋ฐฑ๋ก๊ทธ์์ ์ ์์ ์ ์๋ก ๊ณ
๋ณ๊ฒฝ์ ์ํ ์ฌ๋ฐ๋ฅธ ์์น๊ฐ urllib3์ ์๋ ๊ฒ์ฒ๋ผ ๊ฑฐ์ ๋์๊ฒ ๋ณด์ ๋๋ค. MaxRetryError๋ ์๋ ์ฌ์๋์ ๋งฅ๋ฝ์์ ๋ฐ์ํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ด์ง๋ง ์ฌ์๋๊ฐ 0์ธ ๊ฒฝ์ฐ(์๋ง๋ ์์งํ ์์ฒญ ๊ฒฝํ) ํผ๋์ค๋ฌ์ธ ์ ์์ต๋๋ค.
urllib3์์๋ ์์ฒญ์ ํตํด ํผ๋์ค๋ฌ์ด ์ค๋ฅ๊ฐ ์ฌ๊ธฐ ์์ ํธ๋ฆฌ๊ฑฐ๋ ์ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. retries==0 and max_retries!=0
๋๋ง MaxRetryError ๋ฅผ ๋ฐ์์ํค๋ ๊ฒ์ด ์ข์ต๋๋ค. max_retries==0
๋์ ์ผ๋ฐ RequestError ๊ฐ ๋ฐ์ํ๋ฉด ๋์ ๋ฐ์ํฉ๋๋ค.
์์ฒญ์ ์ํด ์ฌ์ฉ๋๋ urllib3๊ฐ ํฌํจ๋ ํจํค์ง์ ์กด์ฌํ๋ ๊ฒ์ ๋ณด์์ต๋๋ค. ๊ทธ๋ฅ ๊ถ๊ธํด์์. ์ ๊ทธ๋ฐ๊ฐ์? ์ด์จ๋ , ์ด๊ฒ๋ค์ ๋ด๊ฐ ๊ฑฐ๊ธฐ์์ ๋์ง๊ณ ์ถ์๋ ๋ช ๊ฐ์ง ์์ด๋์ด์์ต๋๋ค. ๋๋ ์ฌ์ ํ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ๋ฐ๋ผ์ก๊ณ ์๋ค.
์์ ์ฌํญ์ด urllib3์ ์ํ๋์ง ์ฌ๋ถ๋ ์์ ํ @shazow์ ๋ฌ๋ ค ์์ต๋๋ค. urllib3๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก _does_ ์ฌ์๋(IIRC 3ํ)ํ๋ค๋ ์ ์ ๊ฐ์ํ ๋ urllib3์ ๋์์ ๊ทธ๋๋ก ์ ์งํ๊ธฐ๋ฅผ ์ํ ์ ์์ต๋๋ค. ๊ทธ์ ์ ๋ ฅ์ ์ป๊ธฐ ์ํด ๊ทธ๋ฅผ ํ(ping)ํฉ๋๋ค.
์ผ๋ถ ์ข ์์ฑ ๋ฌธ์ ๋ฅผ ํผํ๊ธฐ ์ํด urllib3์ ๊ณต๊ธํฉ๋๋ค. ๋ณธ์ง์ ์ผ๋ก ์ด๊ฒ์ ์ฐ๋ฆฌ๊ฐ ํญ์ ์๋ ค์ง ๋ฒ์ ์ urllib3์ ๋ํด ์๋ํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ์ด๊ฒ์ ๊ฑฐ์น ์ธ๋ถ ์ฌํญ์ ์ํ ๊ฒฝ์ฐ #1384 ๋ฐ #1812์์ ๊ทน๋๋ก ๊ธธ๊ฒ ๋ ผ์๋์์ต๋๋ค.
ํด ๊ป๋๋ฝ์ง๋ง ์ ์ตํฉ๋๋ค. @shazow ์ด๊ฒ๋ค์ ๋ด๊ฐ ๊ฐ์ง ๋ช ๊ฐ์ง ์๊ฐ์ ๋๋ค. ์์ ๊ฐ์ด MaxRetryError ๋์ RequestError๋ฅผ ๋ฐ์์ํต๋๋ค. ์ ๋ง urlopen ์ ํ์ธํ ํ MaxRetryError๋ฅผ ๋ ์ ์ดํดํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ด์ค ํธ์ง: ์ค์ ๋ก๋ kwarg์ผ์ง๋ผ๋ raise MaxRetryError(retries=0)
ํ๊ณ retries==0
์ ๋ฉ์์ง๋ฅผ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
์ฌ์๋๋ฅผ ์์ ํ ๋นํ์ฑํํ๊ณ ํญ์ MaxRetryError
๋์ ์๋ ์์ธ๋ฅผ ๋ฐ์์ํค๋ retries=False
๋ ์ด๋ป์ต๋๊น?
urlopen์ ์ฌ์๋ ์์์ ์์ฒญํ๋ ๊ฒ๊ณผ ์ฌ์๋ ํ์์์ 0์ผ๋ก ์นด์ดํธ๋ค์ดํ๋ ๊ฒ์ ๊ตฌ๋ณํ ์ ์์ผ๋ฉด ์ ์ฉํ ๊ฒ์ ๋๋ค. ์ฌ์๋๋ฅผ ์์ฒญํ์ง ์์ ๊ฒฝ์ฐ MaxRetryError๊ฐ ํ์๋๋ ๊ฒ์ ์ด์ํ ์ผ์ ๋๋ค.
๋๊ตฌ๋ ์ง ์ด์ ๋ํ ํจ์น+ํ ์คํธ๋ฅผ ํ๊ณ ์ถ๋ค๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค. :)
@shazow ํ๋ฅญํฉ๋๋ค. ์ฌ์ดํด์ ์ฐพ์ ์ ์๋ค๋ฉด ๊ฒ์์ ํ๊ณ ์ถ์ต๋๋ค. ๋ญ๊ฐ ์์ผ๋ฉด ํํ๊ฒ ์ต๋๋ค.
\์ํ/
^^ ํจ์น๊ฐ ๋์จ๊ฑด์ง ๊ถ๊ธํฉ๋๋ค. ์ด ๋ฌธ์ ๋ 1๋ ์ด ์ง๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋ด๊ฐ ์๋ ํ. =)
retries=False
๋ v1.9๋ถํฐ ์๋ ์์ธ๋ฅผ ๋ฐ์์์ผ์ผ ํฉ๋๋ค(๋ํ ์์).
@kevinburke ์๊ฐ?
์๊ฐ์ด ์กฐ๊ธ ๋ ํ์ํฉ๋๋ค
์ผ๋น ๋ฒํฌ
์ ํ: 925.271.7005 | 20๋ฐ๋ฆฌ์ด.com
2014๋
10์ 5์ผ ์ผ์์ผ ์ค์ 10์ 37๋ถ, Ian Cordasco [email protected]
์ผ๋ค:
@kevinburke https://github.com/kevinburke ์๊ฐ?
โ
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ฑฐ๋ GitHub์์ ํ์ธํ์ธ์.
https://github.com/kennethreitz/requests/issues/1198#issuecomment -57945403
.
๋ค ํด๊ฒฐ๋ ๊ฒ ๊ฐ์์
requests.get('http://localhost:11211')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "requests/api.py", line 60, in get
return request('get', url, **kwargs)
File "requests/api.py", line 49, in request
return session.request(method=method, url=url, **kwargs)
File "requests/sessions.py", line 457, in request
resp = self.send(prep, **send_kwargs)
File "requests/sessions.py", line 569, in send
r = adapter.send(request, **kwargs)
File "requests/adapters.py", line 407, in send
raise ConnectionError(err, request=request)
requests.exceptions.ConnectionError: ('Connection aborted.', error(61, 'Connection refused'))
๋ด๊ฐ ๋๋ฌด ๋ด ๋์์ ์ฐ๊ฒฐ ๊ฑฐ๋ถ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ด ์ด๋ป๊ฒ ํด๊ฒฐ๋์๋์ง ์๋ ค์ฃผ์๊ฒ ์ต๋๊น? ๋ด ํ์ด์ฌ ์คํฌ๋ฆฝํธ์์ RPC ์๋ฒ์ ์ฐ๊ฒฐํ๋ ค๊ณ ํฉ๋๋ค
@SiddheshS ์ด ๋ฌธ์ ๋ ์ผ๋ถ ์์ธ๋ฅผ ์์ ํ์ฌ ์์ ๋์์ต๋๋ค. ์ค์ ์ฐ๊ฒฐ ๊ฑฐ๋ถ ์ค๋ฅ์ ๊ด๋ จ์ด ์์ต๋๋ค. ๋ฌธ์ ์ ๋ํ ๋์์ ์์ฒญํ๋ ค๋ฉด ์คํ ์ค๋ฒํ๋ก ์ฌ์ฉ์ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. ๋๋๋ก ๋ฐ์ํ์ต๋๋ค. ํด๊ฒฐ ๋ฐฉ๋ฒ, ๋๋ฅผ ๋์ธ ์ ์๋ ์ฌ๋์ด ์์ต๋๊น? .๊ฐ์ฌ ํด์.
requests.exceptions.ConnectionError: HTTPSConnectionPool(host='api.xxxx.com', port=443): URL์์ ์ต๋ ์ฌ์๋ ํ์ ์ด๊ณผ: /v2/goods/?category=0&sort_type=2&page_size=3&page_num=13&t=0&count=110(์์ธ by NewConnectionError('
์ญ์ถ์ (๊ฐ์ฅ ์ต๊ทผ ํธ์ถ ๋ง์ง๋ง):
ํ์ผ "test.py", 335ํ,
๊ธฐ๋ณธ()
ํ์ผ "test.py", 290ํ, ๋ฉ์ธ
๊ฒฐ๊ณผ = get_goods_info()
get_goods_info์์ ํ์ผ "test.py", 67ํ
๊ฒฐ๊ณผ = ์์ฒญ.get(URL)
ํ์ผ "/usr/local/lib/python2.7/site-packages/requests/api.py", 69ํ, get
๋ฐํ ์์ฒญ('get', url, params=params, *_kwargs)
์์ฒญ ์ ํ์ผ "/usr/local/lib/python2.7/site-packages/requests/api.py", 50ํ
์๋ต = session.request(๋ฉ์๋=๋ฉ์๋, url=url, *_kwargs)
์์ฒญ ์ ํ์ผ "/usr/local/lib/python2.7/site-packages/requests/sessions.py", 468ํ
resp = self.send(์ค๋น, *_send_kwargs)
ํ์ผ "/usr/local/lib/python2.7/site-packages/requests/sessions.py", 576ํ, ๋ณด๋ด๊ธฐ
r = ์ด๋ํฐ.๋ณด๋ด๊ธฐ(์์ฒญ, *_kwargs)
ํ์ผ "/usr/local/lib/python2.7/site-packages/requests/adapters.py", 423ํ, ๋ณด๋ด๊ธฐ
์ฐ๊ฒฐ ์ค๋ฅ ๋ฐ์(e, ์์ฒญ=์์ฒญ)
@nkjulia ์ฐ๊ฒฐ ์๋๊ฐ ์๊ฐ ์ด๊ณผ๋์ด ์๊ฒฉ ์๋ฒ์ ๊ณผ๋ถํ๊ฐ ๊ฑธ๋ฆฌ๊ฑฐ๋ ์ฐ๊ฒฐ ์๊ฐ ์ด๊ณผ๊ฐ ๋๋ฌด ๋ฎ์์ ๋ํ๋ ๋๋ค.
๋๋ ์ด๊ฑฐ ์๋ชป์์์ด....
@kevinburke ์ฐ๊ฒฐ ๊ฑฐ๋ถ ์ค๋ฅ๊ฐ ๋ฐ์ํ ํ ๋ฌธ์ ๊ฐ ์ด๋ป๊ฒ ํด๊ฒฐ๋์์ต๋๊น? ์กฐ์ธ ๋ถํ๋๋ฆฝ๋๋ค. ํฐ์
๋ด ํฌ์คํธ ๋ฉ์ดํธ๋ฅผ ๋ฌด์ํ์ญ์์ค. ๋ด ์ปดํจํฐ์ ์ฌ๋ฌ ๋ฒ์ ์ ํ์ด์ฌ์ด ์์ด์ ์ฌ๋ฐ๋ฅธ ๋ฒ์ ์ ์ ํํ ์ ์๊ณ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค. ๋๊ตฐ๊ฐ์๊ฒ ๋์์ด ๋ ์ ์๋ค๋ ์๊ฐ์ ์ด ๊ธ์ ์ฌ๋ฆฝ๋๋ค.
๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. ๋๋๋ก ๋ฐ์ํ์ต๋๋ค. ํด๊ฒฐ ๋ฐฉ๋ฒ, ๋๋ฅผ ๋์ธ ์ ์๋ ์ฌ๋์ด ์์ต๋๊น? .๊ฐ์ฌ ํด์.
requests.exceptions.ConnectionError: HTTPSConnectionPool(host='api.xxxx.com', port=443): URL์์ ์ต๋ ์ฌ์๋ ํ์ ์ด๊ณผ: /v2/goods/?category=0&sort_type=2&page_size=3&page_num=13&t=0&count=110(์์ธ by NewConnectionError('
: ์ ์ฐ๊ฒฐ์ ์ค์ ํ์ง ๋ชปํ์ต๋๋ค: [Errno 110] ์ฐ๊ฒฐ ์๊ฐ์ด ์ด๊ณผ๋์์ต๋๋ค',))
์ญ์ถ์ (๊ฐ์ฅ ์ต๊ทผ ํธ์ถ ๋ง์ง๋ง):
ํ์ผ "test.py", 335ํ,
๊ธฐ๋ณธ()
ํ์ผ "test.py", 290ํ, ๋ฉ์ธ
๊ฒฐ๊ณผ = get_goods_info()
get_goods_info์์ ํ์ผ "test.py", 67ํ
๊ฒฐ๊ณผ = ์์ฒญ.get(URL)
ํ์ผ "/usr/local/lib/python2.7/site-packages/requests/api.py", 69ํ, get
๋ฐํ ์์ฒญ('get', url, params=params, *_kwargs)
์์ฒญ ์ ํ์ผ "/usr/local/lib/python2.7/site-packages/requests/api.py", 50ํ
์๋ต = session.request(๋ฉ์๋=๋ฉ์๋, url=url, *_kwargs)
์์ฒญ ์ ํ์ผ "/usr/local/lib/python2.7/site-packages/requests/sessions.py", 468ํ
resp = self.send(์ค๋น, *_send_kwargs)
ํ์ผ "/usr/local/lib/python2.7/site-packages/requests/sessions.py", 576ํ, ๋ณด๋ด๊ธฐ
r = ์ด๋ํฐ.๋ณด๋ด๊ธฐ(์์ฒญ, *_kwargs)
ํ์ผ "/usr/local/lib/python2.7/site-packages/requests/adapters.py", 423ํ, ๋ณด๋ด๊ธฐ
์ฐ๊ฒฐ ์ค๋ฅ ๋ฐ์(e, ์์ฒญ=์์ฒญ)
์ด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์๋ค๋ฉด ์กฐ์ธ์ ๋ถํ๋๋ฆฝ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๋๋ ์ด๊ฒ์ด ์๋นํ ํผ๋์ค๋ฝ๋ค๋ ๊ฒ์ ๋์ํฉ๋๋ค. ์์ฒญ์ ์ ๋ ์ฌ์๋ํ์ง ์์ผ๋ฏ๋ก(urllib3์ HTTPConnectionPool์ ๋ํด retries=0์ผ๋ก ์ค์ ) HTTPConnectionPool/MaxRetryError ํญ๋ชฉ์ด ์์ผ๋ฉด ์ค๋ฅ๊ฐ ํจ์ฌ ๋ ๋ช ํํด์ง๋๋ค. ์ผ๋ง๋ ๋ง์ ์ฌ์๋๋ฅผ ์ํํ๋์ง ์์๋ด๊ธฐ ์ํด ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์์ค ์ฝ๋๋ฅผ ์ดํด๋ด์ผ ํ๋ ์ง๊ธ๊น์ง ์์ฒญ์ด urllib3๋ฅผ ์ฌ์ฉํ๋ค๋ ์ฌ์ค์ ๊นจ๋ซ์ง ๋ชปํ์ต๋๋ค.
์ด์์ ์ผ๋ก ์์ธ๋ ๋ค์๊ณผ ๊ฐ์ด ๋ณด์ผ ๊ฒ์ ๋๋ค.