2011-09-22 16 views
5

ho qualche codice di prova (come parte di una webapp) che urllib2 utilizza per eseguire un'operazione Io di solito eseguire tramite un browser:Problema Urllib2 inspiegabile tra virtualenv's.

  • Accedere a un sito web remoto
  • Sposta in un'altra pagina
  • Eseguire un POST compilando un modulo

ho creato 4, virtualenvs pulite separati (con i pacchetti --no-site-) su 3 macchine differenti, tutti con diverse versioni di Python, ma esattamente lo stesso pacchetti (tramite il file dei requisiti del pip) e il codice o funziona sui due virtualenv sulla mia macchina di sviluppo locale (2.6.1 e 2.7.2) - non funzionerà su nessuno dei miei VPS di produzione

In caso contrario, posso accedere correttamente, passare al pagina corretta ma quando invio il modulo, il server remoto risponde dicendomi che c'è stato un errore - è una pagina di errore del server delle applicazioni ('non abbiamo potuto completare la richiesta') e non un errore del server web.

  • perché posso accedere correttamente e manovrare per una seconda pagina, questo non sembra essere una sessione o un problema cookie - è particolare per la finale POST
  • perché posso eseguire l'operazione su un particolare macchina con le stesse intestazioni e dati ESATTI, questo non sembra essere un problema con quello che sto richiedendo/pubblicando
  • perché sto provando il codice su due VPS separati presi in affitto da aziende diverse, questo non sembra essere un problema con l'ambiente fisico VPS
  • perché il codice funziona su 2 diverse versioni python, non posso immaginare che sia un incompa problema bilty

Sono completamente perso in questa fase sul perché questo non avrebbe funzionato. Ho persino "ribaltato e acceso-di nuovo" perché non riesco a vedere quale potrebbe essere il problema.

Penso che debba essere qualcosa a che fare con il POST finale proveniente da un VPS che al server remoto non piace, ma non riesco a capire cosa possa essere. Mi sembra che ci sia qualcosa sotto la cappa di URLlib che sta facendo impazzire il server remoto dalla risposta.

EDIT Ho installato la stessa versione di Python esatto (2.6.1) sui VPS come è sul mio lavoro copia locale e non funziona in modalità remota, quindi deve essere qualcosa a che fare con provenienti da un VPS. Come può questo effetto la richiesta Http? È qualcosa di più basso livello?

+0

Esistono firewall in esecuzione sul VPS o sul sito Web di destinazione? Stai usando i cookie e, in caso affermativo, vengono scritti correttamente nella produzione? –

+0

No, lo sto eseguendo su due VPS separati e non funziona per nessuno dei due, ma non penso che siano dietro ai firewall. Sto usando i cookie con cookielib, ma non penso che questo sia il problema perché i cookie funzionano per le prime due operazioni (login e cambio pagina) –

risposta

0

Bene, sembra che conosca perché il problema stava accadendo, ma non sono al 100% la ragione.

ho dovuto semplicemente per rendere il server di attesa (time.sleep()) dopo aver inviato la seconda richiesta (passa ad un'altra pagina) prima di fare il 3 ° richiesta (Eseguire un POST compilando un modulo) .

Non so a causa di una condizione con il server di terze parti o se si tratta di una sorta di problema con URLlib? Il motivo per cui sembrava funzionare sulla mia macchina di sviluppo è presumibilmente perché era più lento del server nell'eseguire il codice?

1

Si potrebbe provare a impostare il debuglevel = 1 per urllib2 e vedere che cosa si tratta con:

import urllib2 
h=urllib2.HTTPHandler(debuglevel=1) 
opener = urllib2.build_opener(h) 
... 
+0

Ho passato con loro un pettine a denti stretti! Ho anche confrontato quelli lavorativi con quelli non funzionanti e sono abbastanza identici. Modificherò e inserirò alcuni esempi –

1

Questo è un colpo totale nel buio, ma sono il tuo VPS a 64 bit e il vostro computer di casa 32 -bit o viceversa? Forse una differenza di dimensioni o precisioni predefinite di qualcosa di potrebbe spaventare il server.

Eccetto, puoi provare a scoprire qualsiasi informazione sullo stack software utilizzato dal server web?

+0

Buon suggerimento, ma sfortunatamente sono uguali! –

1

Ho avuto problemi simili con urllib2 (lavorando con RIM api di Zimbra), alla fine sono passato a pycurl con successo.

PS per le operazioni di accesso/navigazione/post, di solito trovo lo Mechanize utile e facile da usare. Forse puoi dargli uno spettacolo.

+0

Penso che questa potrebbe essere l'unica opzione in questa fase. Ho provato tutto immaginabile per farlo funzionare e posso solo immaginare che si tratti di un oscuro problema di compatibilità. In realtà stavo usando Mechanize che è eccellente, ma sfortunatamente credo che si trovi in ​​cima a Urllib2, il che significa che si verifica lo stesso problema. –