2009-12-18 10 views
15

Ho usato due diverse librerie oauth Python con Django per l'autenticazione con twitter. L'installazione è su apache con WSGI. Quando riavvio il server tutto funziona alla grande per circa 10 minuti e quindi il httplib sembra bloccarsi (vedere il seguente errore).httplib CannotSendRequest error in WSGI

Sto eseguendo solo 1 processo e 1 thread di WSGI ma ciò sembra non fare alcuna differenza.

Non riesco a capire perché sta bloccando e dando questo errore CannotSendRequest. Ho passato molte ore su questo problema frustrante. Qualsiasi suggerimento/suggerimento su ciò che potrebbe essere sarebbe molto apprezzato.

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

risposta

25

Questa eccezione viene sollevata quando si riutilizza httplib.HTTP oggetto di nuova richiesta, mentre si havn't chiamato il suo metodo getresponse() per la richiesta precedente. Probabilmente c'è stato un altro errore prima di questo che ha lasciato la connessione in uno stato di errore. Il modo più semplice e affidabile per risolvere il problema è creare una nuova connessione per ogni richiesta, non riutilizzarla. Certo, sarà un po 'più lento, ma penso che non sia un problema avere un'applicazione in esecuzione in singolo processo e thread singolo.

+0

Ottimo! Il tuo suggerimento mi ha portato a trovare la riga errata nella libreria di auth di Twitter che stavo usando. Grazie mille! – Dave

+3

@Dato poiché sto riscontrando lo stesso problema con la mia libreria auth di Twitter, puoi condividere le modifiche che hai apportato? –

+0

@Dave qual è la soluzione? è una cortesia comune lasciare una soluzione se ne trovi una ... – CoolGravatar

0

Controllare anche la versione di Python. Ho avuto una situazione simile dopo l'aggiornamento a Py-2.7 da Py-2.6. In Py-2.6 tutto ha funzionato senza problemi. Py-2.7 httplib utilizza HTTP/1.1 per impostazione predefinita che ha reso il server non ha restituito la connessione : chiude l'opzione nella risposta, pertanto la gestione della connessione è stata interrotta. Nel mio caso questo ha funzionato con HTTP/1.0 però.