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
使用 apache mod_wsgi 的 Django 多个站点:请求到错误的站点