2009-12-18 16 views
15

He utilizado dos bibliotecas de Othon de python diferentes con Django para autenticarme con Twitter. La configuración está en apache con WSGI. Cuando reinicio el servidor todo funciona bien durante unos 10 minutos y luego parece que el httplib se bloquea (vea el siguiente error).httplib Error de CannotSendRequest en WSGI

Estoy ejecutando solo 1 proceso y 1 hilo de WSGI, pero eso parece no hacer diferencia.

No puedo entender por qué se está bloqueando y dando este error CannotSendRequest. He pasado muchas horas en este frustrante problema. Cualquier sugerencia/sugerencias de lo que podría ser sería muy apreciada.

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

Respuesta

25

Esta excepción se produce cuando se vuelve a utilizar httplib.HTTP objeto de nueva solicitud mientras havn't llama a su método de getresponse() solicitud anterior. Probablemente hubo otro error antes de este que dejó la conexión en estado roto. La forma más sencilla y confiable de solucionar el problema es crear una nueva conexión para cada solicitud, sin reutilizarla. Claro, será un poco más lento, pero creo que no es un problema tener que ejecutar la aplicación en un solo proceso y un solo hilo.

+0

¡Genial! Su sugerencia me llevó a encontrar la línea incorrecta en la biblioteca de autenticación de Twitter que estaba usando. ¡Gracias una tonelada! – Dave

+3

@Dave ya que estoy teniendo el mismo problema con mi biblioteca de autor de Twitter, ¿puede compartir qué cambio ha realizado? –

+0

@Dave cuál es la solución? es una cortesía común dejar una solución si encuentra una ... – CoolGravatar

0

También verifique su versión de Python. Tuve una situación similar después de actualizar a Py-2.7 desde Py-2.6. En Py-2.6 todo funcionó sin problemas. Py-2.7 httplib usa HTTP/1.1 de forma predeterminada, lo que hizo que el servidor no devolviera la conexión : cierre la opción en la respuesta, por lo que se interrumpió el manejo de la conexión. En mi caso, esto funcionó con HTTP/1.0.