Ошибка httplib CannotSendRequest в WSGI

Я использовал две разные библиотеки oauth python с Django для аутентификации с помощью твиттера. Настройка выполняется на apache с WSGI. Когда я перезапускаю сервер, все работает отлично около 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()

CannotSendRequest

Ответы

Ответ 1

Это исключение возникает при повторном использовании объекта httplib.HTTP для нового запроса, пока вы не вызвали его метод getresponse() для предыдущего запроса. Вероятно, произошла какая-то другая ошибка перед тем, что оставило соединение в сломанном состоянии. Самый простой надежный способ решения проблемы - создание нового соединения для каждого запроса, а не его повторное использование. Конечно, это будет немного медленнее, но я думаю, что это не проблема, когда вы запускаете приложение в одном процессе и в одном потоке.

Ответ 2

Также проверьте версию Python. У меня была аналогичная ситуация после обновления до Py-2.7 от Py-2.6. В Py-2.6 все работало без проблем. Py-2.7 httplib по умолчанию использует HTTP/1.1, что заставило сервер не отправить обратно параметр "Соединение: закрыть" в ответе, поэтому обработка соединения была нарушена. В моем случае это работало с HTTP/1.0, хотя.