2009-12-18 10 views
15

J'ai utilisé deux bibliothèques puthon oauth différentes avec Django pour m'authentifier auprès de twitter. L'installation est sur Apache avec WSGI. Lorsque je redémarre le serveur, tout fonctionne parfaitement pendant environ 10 minutes, puis le httplib semble se verrouiller (voir l'erreur suivante).httplib Erreur CannotSendRequest dans WSGI

Je cours seulement 1 processus et 1 fil de WSGI mais cela semble ne faire aucune différence.

Je n'arrive pas à comprendre pourquoi il se bloque et donne cette erreur CannotSendRequest. J'ai passé beaucoup d'heures sur ce problème frustrant. Tous les conseils/suggestions de ce que cela pourrait être serait grandement apprécié.

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

Répondre

25

Cette exception est levée lorsque vous réutilisez objet httplib.HTTP pour une nouvelle demande pendant que vous havn't appelé sa méthode getresponse() de la demande précédente. Probablement il y avait une autre erreur avant celle-ci qui a laissé la connexion à l'état brisé. La solution la plus simple et la plus fiable consiste à créer une nouvelle connexion pour chaque requête, sans la réutiliser. Bien sûr, ce sera un peu plus lent, mais je pense que ce n'est pas un problème si vous utilisez une application en un seul processus et un seul thread.

+0

Super! Votre conseil m'a conduit à trouver la mauvaise ligne dans la bibliothèque d'autorisation Twitter que j'utilisais. Merci beaucoup! – Dave

+3

@Dave depuis que je suis le même problème avec ma bibliothèque d'autorisation twitter, pouvez-vous partager ce changement que vous avez fait? –

+0

@Dave quelle est la solution? Il est commun de laisser une solution si vous en avez trouvé une ... – CoolGravatar

0

Vérifiez également votre version de Python. J'ai eu une situation similaire après la mise à jour à Py-2.7 de Py-2.6. Dans Py-2.6, tout a fonctionné sans aucun problème. Py-2.7 httplib utilise HTTP/1.1 par défaut ce qui fait que le serveur n'a pas renvoyé l'option Connection: close dans la réponse, donc la gestion des connexions a été rompue. Dans mon cas, cela a fonctionné avec HTTP/1.0 cependant.