16

我在 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()

无法发送请求

4

2 回答 2

30

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

于 2009-12-18T10:00:26.590 回答
0

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

于 2015-05-02T18:31:29.450 回答