2009-12-18 22 views
15

我用Django使用两个不同的python oauth库来与twitter进行身份验证。该设置是在WSGI的apache上。当我重新启动服务器时,一切正常工作约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() 

CannotSendRequest

回答

25

,当你重新使用新的请求httplib.HTTP对象,而你没有带呼吁其以前的请求getresponse()方法,引发此异常。在此之前,可能还有其他错误导致连接处于断开状态。解决问题的最简单可靠的方法是为每个请求创建新连接,而不是重用它。当然,它会慢一点,但我认为这不是一个单一进程和单线程运行应用程序的问题。

+0

太棒了!你的提示让我发现我使用的twitter auth库中的坏行。万分感谢! – Dave 2009-12-20 01:04:05

+3

@Dave,因为我与我的twitter auth库有同样的问题,你能分享你所做的改变吗? – 2011-03-11 16:52:50

+0

@Dave什么是解决方案?如果你找到一个解决方案,离开解决方案是很常见的... – CoolGravatar 2011-03-16 05:08:31

0

另请检查您的Python版本。从Py-2.6更新到Py-2.7后,我有类似的情况。在Py-2.6中一切正常,没有任何问题。 Py-2.7 httplib默认使用HTTP/1.1,这使得服务器在响应中没有发回连接:关闭选项,因此连接处理被中断。在我的情况下,这与HTTP/1.0虽然工作。