2011-09-22 8 views
5

que tienen algún código de prueba (como parte de una aplicación web) que utiliza urllib2 para realizar una operación por lo general me llevaría a cabo a través de un navegador:Problema Urllib2 inexplicable entre virtualenv.

  • Acceder a un sitio web remoto
  • desplazarse a otra página
  • realizar una post mediante la cumplimentación de un formulario

he creado 4 virtualenvs separados, limpios (con paquetes --no-site-) en 3 máquinas diferentes, todos con diferentes versiones de Python, pero la misma exacta paquetes (a través del archivo de requisitos pip), y el código de nly funciona en los dos virtualenvs en mi máquina de desarrollo local (2.6.1 y 2.7.2) - no funcionará en ninguno de mis VPS de producción

En los casos con fallas, puedo iniciar sesión con éxito, moverme al página correcta, pero cuando envío el formulario, el servidor remoto responde diciéndome que ha habido un error: es una página de error del servidor de aplicaciones ("no pudimos completar su solicitud") y no un error del servidor web.

  • porque puedo entrar con éxito en y maniobrar a una segunda página, esto no parece ser una sesión o un problema de galletas - es particular, a la final de la POST
  • porque puedo realizar la operación en una máquina en particular con los mismos encabezados y datos exactos, esto no parece ser un problema con lo que solicito/publicar
  • porque estoy tratando el código en dos VPS separados alquilado a diferentes empresas, esto no parece ser un problema con el entorno físico de VPS
  • porque el código funciona en 2 versiones diferentes de python, no puedo imaginar que sea un incompa problema bilty

Estoy completamente perdido en esta etapa de por qué esto no funcionaría. Incluso lo 'apagué y volví a encender' porque no puedo ver cuál podría ser el problema.

creo que tiene que ser algo que ver con el final del poste procedente de un VPS que el servidor remoto no le gusta, pero no puedo averiguar lo que podría ser. Siento que algo está sucediendo bajo el capó de URLlib que está causando que el servidor remoto detecte la respuesta.

EDITAR He instalado la misma versión exacta de Python (2.6.1) en el VPS como es en mi copia local de trabajo y que no funciona de forma remota, por lo que debe ser algo que ver con los procedentes de un VPS. ¿Cómo podría esto afectar la solicitud de Http? ¿Es algo de nivel inferior?

+0

¿Hay firewalls ejecutándose en el VPS o en el sitio web de destino? ¿Estás usando cookies, y si es así, están siendo escritas correctamente en producción? –

+0

No, lo estoy ejecutando en dos VPS separados y no funciona para ninguno, pero no creo que estén detrás de los firewalls. Estoy usando cookies con cookielib, pero no creo que ese sea el problema porque las cookies funcionan para las dos primeras operaciones (inicio de sesión y página de cambio) –

Respuesta

0

Bueno, parece que sé por qué el problema estaba sucediendo, pero no soy el 100% de la razón para ello.

simplemente tenía que hacer esperar al servidor (time.sleep()) después de haber enviado la segunda petición (desplazarse a otra página) antes de hacer la tercera petición (realizar una post mediante la cumplimentación de un formulario) .

No sé si es por una condición con el servidor de terceros, o si se trata de algún tipo de problema con URLlib? La razón por la que parecía funcionar en mi máquina de desarrollo es presumiblemente porque era más lento que el servidor para ejecutar el código.

1

Usted puede tratar de establecer el debuglevel = 1 para urllib2 y ver lo que viene con:

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

¡He pasado por ellas con un peine de dientes finos! También comparé los que están trabajando con los que no funcionan y son bastante idénticos. Voy a editar y poner algunos ejemplos –

1

Esto es un tiro total en la oscuridad, pero son su VPS de 64 bits y su ordenador personal 32 -bit, o viceversa? Tal vez una diferencia en tamaños predeterminados o precisiones de algo podría estar volviendo loco el servidor.

Al margen de eso, ¿puede intentar encontrar información sobre la pila de software que está utilizando el servidor web?

+0

¡Buena sugerencia, pero desafortunadamente son lo mismo! –

1

tuve problemas similares con urllib2 (trabajar con la API REST de Zimbra), al final cambió a pycurl con éxito.

PS para las operaciones de inicio de sesión/navegar/publicar, suelo encontrar Mechanize útil y fácil de usar. Tal vez puedas darle un espectáculo.

+0

Creo que esta podría ser la única opción en esta etapa. He intentado todo lo posible para que funcione y solo puedo imaginar que es un oscuro problema de compatibilidad. En realidad estaba usando Mechanize, que es excelente, pero desafortunadamente creo que se encuentra sobre Urllib2, lo que significa que ocurre el mismo problema. –