2010-07-12 3 views
29

내가 파이썬을 사용하여 elgg위한 REST 클라이언트를 쓰고 있어요, 그리고 요청이 성공해도, 내가 응답이 얻을 : 내가 볼 헤더를 보면파이썬 HTTPLIB ResponseNotReady

Traceback (most recent call last): 
    File "testclient.py", line 94, in <module> 
    result = sendMessage(token, h1) 
    File "testclient.py", line 46, in sendMessage 
    res = h1.getresponse().read() 
    File "C:\Python25\lib\httplib.py", line 918, in getresponse 
    raise ResponseNotReady() 
httplib.ResponseNotReady 

('내용 길이 ','5749 '), 거기에 페이지가 있다는 것을 알았으나 예외가 발생했기 때문에 .read()를 사용하여 볼 수 없습니다. ResponseNotReady의 의미는 무엇이며 반환 된 콘텐츠를 볼 수없는 이유는 무엇입니까?

+0

연결을 다시 사용 하시겠습니까? – ChristopheD

+0

사실. 기이하게도 때로는 효과가 있고 때때로 그렇지 않습니다. 나는 어떤 행동이 그것을 결정 하는지를 결정할 수 없다. – directedition

답변

35

이전 연결에서 동일한 개체를 다시 사용하지 않도록하십시오. 서버 연결 유지이 끝나고 소켓이 닫히면이 값에 도달합니다.

+1

일반적으로 성능에 대한 구체적인 요구가없는 한 일반적으로 HttpRequest 객체를 다시 사용하려고하지 않습니다. 단지 단일 샷 ' – rossipedia

+0

제 경우에는'preload_content = False'를 추가하면 문제가 해결되었습니다. 다음은 스 니펫입니다.'http = urllib3.PoolManager (threadsNo, maxsize = threadsNo, block = True); request = http.request ('GET', queryUrl, preload_content = False)'위의 매개 변수가 http.request에 전달되지 않으면'request.release_conn()'이 이전 연결 객체를 실제로 해제하지 않는 것처럼 보입니다. 자세한 내용은 여기를 참조하십시오. https://urllib3.readthedocs.org/en/latest/pools.html – dex

2

이 코드 사용하여, 오늘날이 같은 예외로 실행중인 :

conn = httplib.HTTPConnection(self._host, self._port) 
    conn.putrequest('GET', 
     '/retrieve?id={0}'.format(parsed_store_response['id'])) 
    retr_response = conn.getresponse() 

은 내가 putrequest보다는 request을 사용하는 것을 알아 차리지 않았다을; 나는 나의 인터페이스를 섞고 있었다. 아직 요청을 보내지 않았기 때문에 ResponseNotReady가 발생했습니다.

49

이전 답변이 맞았지만 예외가 발생할 수있는 또 다른 경우가 있습니다. 중간 응답을 완전히 읽지 않고 여러 요청을 수행하는 경우입니다. 예를 들어

:

conn.request('PUT',...) 
conn.request('GET',...) 
# will not work: raises ResponseNotReady 

conn.request('PUT,...) 
r = conn.getresponse() 
r.read() # <-- that's the important call! 
conn.request('GET',...) 
r = conn.getresponse() 
r.read() # <-- same thing 

등등.

+0

.thread (.) 연결을 다시 사용할 수 있도록 .read()가 필요합니다. – schwiz

+0

은 .read() 비쌉니다. 응답에 신경 쓰지 않으면 어떻게해야합니까? > – SoulMan

+2

@ronnefeldt, https://docs.python.org/3/library/http.client.html의 Python 문서에는 다음과 같은 메모가 있습니다. "이전에 전체 응답을 읽었 으면합니다. 서버에 새로운 요청을 보낼 수 있습니다. " – mvsagar

0

또한 서버가 Content-Length 헤더없이 응답을 보내면 Keep-Alive가 사용되고 다른 요청이 동일한 소켓을 통해 전송되는 경우 HTTP 클라이언트의 상태가 손상 될 수 있습니다.

0

방화벽이 연결을 차단하는 경우에도 발생할 수 있습니다.