WSGI 中的 httplib 无法发送请求错误

Posted

技术标签:

【中文标题】WSGI 中的 httplib 无法发送请求错误【英文标题】:httplib CannotSendRequest error in WSGI 【发布时间】:2010-12-27 21:26:07 【问题描述】:

我在 Django 中使用了两个不同的 python oauth 库来通过 twitter 进行身份验证。设置是在带有 WSGI 的 apache 上。当我重新启动服务器时,一切正常运行了大约 10 分钟,然后 httplib 似乎被锁定(请参阅以下错误)。

我只运行 1 个进程和 1 个 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()

无法发送请求

【问题讨论】:

【参考方案1】:

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

【讨论】:

太棒了!您的提示使我在我正在使用的 twitter auth 库中找到了错误的行。非常感谢! @Dave 因为我的 twitter auth 库也有同样的问题,你能分享一下你做了什么改变吗? @Dave 有什么解决方案?如果您找到了解决方案,通常会留下解决方案... 似乎我们中的一些人最近开始遇到这个问题。有知道的修复方法吗? 戴夫回答过你吗?【参考方案2】:

还要检查您的 Python 版本。从 Py-2.6 更新到 Py-2.7 后,我也遇到了类似的情况。在 Py-2.6 中,一切正常,没有任何问题。 Py-2.7 httplib 默认使用 HTTP/1.1,这使得服务器没有在响应中发回 Connection: close 选项,因此连接处理被破坏。就我而言,这适用于 HTTP/1.0。

【讨论】:

以上是关于WSGI 中的 httplib 无法发送请求错误的主要内容,如果未能解决你的问题,请参考以下文章

cpp-httplib 中的 HTTPS 给 Segfault

beego客户端请求httplib

使用 apache mod_wsgi 的 Django 多个站点:请求到错误的站点

错误:在 apache 上运行 django 时找不到目标 WSGI 脚本或无法统计

通过httplib2 探索的学习的最佳方式

Apache + mod_wsgi + django:为积压的请求发送默认响应