2009-12-18 9 views
15

Ich habe zwei verschiedene Python Oauth-Bibliotheken mit Django verwendet, um mit Twitter zu authentifizieren. Das Setup ist auf Apache mit WSGI. Wenn ich den Server neu starte funktioniert alles gut für ca. 10 Minuten und dann scheint die httplib zu sperren (siehe folgenden Fehler).httplib CannotSendRequest Fehler in WSGI

Ich bin nur 1 Prozess und 1 Thread von WSGI ausgeführt, aber das scheint keinen Unterschied zu machen.

Ich kann nicht herausfinden, warum es blockiert und diesen CannotSendRequest Fehler gibt. Ich habe viele Stunden mit diesem frustrierenden Problem verbracht. Irgendwelche Hinweise/Vorschläge von was es sein könnte, würde sehr geschätzt werden.

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

Antwort

25

Diese Ausnahme wird ausgelöst, wenn Sie httplib.HTTP Objekt für neue Anforderung wieder verwenden, während Sie seine getresponse() Methode zur vorherige Anforderung genannt havn't. Wahrscheinlich gab es vor diesem einen anderen Fehler, der die Verbindung im gebrochenen Zustand verließ. Die einfachste zuverlässige Methode zur Behebung des Problems besteht darin, für jede Anforderung eine neue Verbindung zu erstellen und sie nicht erneut zu verwenden. Sicher, es wird ein bisschen langsamer, aber ich denke, es ist kein Problem, wenn Sie Anwendung in Einzelprozess und Single-Thread ausführen.

+0

Großartig! Dein Tipp hat mich dazu gebracht, die schlechte Zeile in der von mir verwendeten Twitter-Auth-Bibliothek zu finden. Danke vielmals! – Dave

+3

@Dave, da ich das gleiche Problem mit meiner Twitter-Auth-Bibliothek habe, können Sie teilen, welche Änderung Sie vorgenommen haben? –

+0

@Dave was ist die Lösung? Es ist üblich, eine Lösung zu hinterlassen, wenn Sie eine gefunden haben ... – CoolGravatar

0

Überprüfen Sie auch Ihre Python-Version. Ich hatte eine ähnliche Situation nach der Aktualisierung auf Py-2.7 von Py-2.6. In Py-2.6 hat alles problemlos funktioniert. Py-2.7 httplib verwendet standardmäßig HTTP/1.1, wodurch der Server die Verbindung nicht zurückgeschickt hat: Schließen Sie die Option in der Antwort, daher wurde die Verbindungsbehandlung unterbrochen. In meinem Fall funktionierte das mit HTTP/1.0.