Requests: max-retries-exceeded ์˜ˆ์™ธ๊ฐ€ ํ˜ผ๋ž€์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2013๋…„ 02์›” 15์ผ  ยท  39์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: psf/requests

์•ˆ๋…•ํ•˜์„ธ์š”,
์˜ˆ๋ฅผ ๋“ค์–ด:

>>> 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์œผ๋กœ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค(์‚ฌ์‹ค ์žฌ์‹œ๋„๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค). ์š”์ฒญ์€ ๋‹จ์ˆœํžˆ ์˜ˆ์™ธ๋ฅผ ๋ž˜ํ•‘ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ตœ์ข… ์‚ฌ์šฉ์ž(์ตœ์ข… ๊ฐœ๋ฐœ์ž)๋ฅผ ํ˜ผ๋ž€์Šค๋Ÿฝ๊ฒŒ ํ•ฉ๋‹ˆ๊นŒ? ํŠนํžˆ ์ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ๋งค์šฐ ์‰ฝ๋‹ค๋Š” ์ ์„ ๊ณ ๋ คํ•˜๋ฉด ์—ฌ๊ธฐ์„œ ๋” ๋‚˜์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

Feature Request

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๋‚˜๋Š” ์ด๊ฒƒ์ด ์ƒ๋‹นํžˆ ํ˜ผ๋ž€์Šค๋Ÿฝ๋‹ค๋Š” ๊ฒƒ์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์š”์ฒญ์€ ์ ˆ๋Œ€ ์žฌ์‹œ๋„ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ(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))

๋ชจ๋“  39 ๋Œ“๊ธ€

์š”์ฒญ์€ ์‚ฌ์šฉ์ž ํŽธ์˜๋ฅผ ์œ„ํ•ด ์˜ˆ์™ธ๋ฅผ ๋ž˜ํ•‘ํ•ฉ๋‹ˆ๋‹ค. 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(': ์ƒˆ ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค: [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, ์š”์ฒญ=์š”์ฒญ)

@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, ์š”์ฒญ=์š”์ฒญ)

์ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ๋‹ค๋ฉด ์กฐ์–ธ์„ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰