Ошибка 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, хотя.