2009-12-18 4 views
15

저는 장고와 함께 두 개의 서로 다른 파이썬 oauth 라이브러리를 사용하여 트위터를 인증했습니다. 설정은 WSGI가있는 아파치에 있습니다. 서버를 다시 시작하면 모든 것이 약 10 분 동안 훌륭하게 작동하고 httplib가 잠기는 것처럼 보입니다 (다음 오류 참조).httplib WSGI의 CannotSendRequest 오류

나는 WSGI의 1 개의 프로세스와 1 개의 스레드 만 실행하고 있지만 차이는 없다.

나는 이것이 왜 CannotSendRequest 오류를 잠그고 제공하는지 파악할 수 없습니다. 나는이 좌절스러운 문제에 많은 시간을 할애했다. 그것이 무엇인지에 대한 어떤 힌트/제안도 크게 감사 할 것입니다.

File "/usr/lib/python2.5/site-packages/django/core/handlers/base.py", line 92, in get_response 
    response = callback(request, *callback_args, **callback_kwargs) 

File "mypath/auth/decorators.py", line 9, in decorated 
    return f(*args, **kwargs) 

File "mypath/auth/views.py", line 30, in login 
    token = get_unauthorized_token() 

File "/root/storm/eye/auth/utils.py", line 49, in get_unauthorized_token 
    return oauth.OAuthToken.from_string(oauth_response(req)) 

File "mypath/auth/utils.py", line 41, in oauth_response 
    connection().request(req.http_method, req.to_url()) 

File "/usr/lib/python2.5/httplib.py", line 866, in request 
    self._send_request(method, url, body, headers) 

File "/usr/lib/python2.5/httplib.py", line 883, in _send_request 
    self.putrequest(method, url, **skips) 

File "/usr/lib/python2.5/httplib.py", line 770, in putrequest 
    raise CannotSendRequest() 

답변

25

이 예외는 당신이 이전 요청에 대한 getresponse() 방법이라고 havn't는 동안 새 요청에 대한 httplib.HTTP 개체를 다시 사용할 때 발생 CannotSendRequest. 아마도이 연결이 깨진 상태로 연결되기 전에 다른 오류가 있었을 것입니다. 문제를 해결하는 가장 간단하고 신뢰할 수있는 방법은 각 요청에 대해 새로운 연결을 생성하고 재사용하지 않는 것입니다. 물론 조금 느려지 겠지만, 단일 프로세스와 단일 스레드로 응용 프로그램을 실행하는 데 문제가되지 않는다고 생각합니다.

+0

좋아요! 당신의 팁은 제가 사용하고있는 트위터 인증 라이브러리에서 나쁜 라인을 찾도록 이끌었습니다. 엄청 고마워! – Dave

+3

@Dave 내 트위터 인증 라이브러리에 동일한 문제가 있기 때문에 변경 한 내용을 공유 할 수 있습니까? –

+0

@ 그 해결책은 무엇입니까? 하나를 찾으면 해결책을 남기는 것이 일반적입니다 ... – CoolGravatar

0

파이썬 버전도 확인하십시오. 나는 Py-2.6에서 Py-2.7로 업데이트 한 후 비슷한 상황을 겪었다. Py-2.6에서는 모든 것이 아무 문제없이 작동했습니다. Py-2.7 httplib은 기본적으로 HTTP/1.1을 사용하여 서버가 Connection : 응답에서 close 옵션을 다시 보내지 않으므로 연결 처리가 중단되었습니다. 내 경우에는이 HTTP/1.0 함께 일했다.