WSGI中的httplib CannotSendRequest错误

17 投票
3 回答
16322 浏览
提问于 2025-04-15 17:09

我在用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()方法,就会出现这个异常。可能在这之前就发生了其他错误,导致连接处于坏状态。解决这个问题最简单可靠的方法是为每个请求创建一个新的连接,而不是重复使用旧的连接。当然,这样做会稍微慢一些,但如果你的应用程序是在单个进程和单个线程中运行,这个速度问题其实不算什么。

撰写回答