WSGI中的httplib CannotSendRequest错误
我在用Django和两个不同的Python OAuth库来实现Twitter的认证。我的服务器是用Apache和WSGI搭建的。当我重启服务器后,一切运行得很好,大约过了10分钟后,httplib似乎就卡住了(见下面的错误信息)。
我只运行了一个WSGI的进程和一个线程,但这似乎没有什么影响。
我搞不明白为什么会卡住,并出现这个“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
3 个回答
0
http.client.CannotSendRequest: Request-sent
在使用 http.client 模块中的 HTTPConnection 类时,遇到了这个错误,因为我的主机名不正确。
0
还要检查一下你的Python版本。我之前也遇到过类似的情况,当我把Python从2.6更新到2.7后,出现了问题。在2.6版本时,一切都运行得很好。而在2.7版本中,httplib默认使用HTTP/1.1,这导致服务器在回应时没有发送Connection: close这个选项,因此连接处理就出错了。不过在我的情况下,使用HTTP/1.0就能正常工作。
34
当你在使用httplib.HTTP
对象发送新请求时,如果之前的请求还没有调用getresponse()
方法,就会出现这个异常。可能在这之前就发生了其他错误,导致连接处于坏状态。解决这个问题最简单可靠的方法是为每个请求创建一个新的连接,而不是重复使用旧的连接。当然,这样做会稍微慢一些,但如果你的应用程序是在单个进程和单个线程中运行,这个速度问题其实不算什么。