2008-10-14 18 views
11

Tengo un sitio web simple que estoy probando. Se ejecuta en localhost y puedo acceder a él en mi navegador web. La página de índice es simplemente la palabra "en ejecución". urllib.urlopen leerá con éxito la página pero urllib2.urlopen no lo hará. Aquí hay un script que muestra el problema (esto es el guión real y no una simplificación de un script de prueba es diferente):urllib.urlopen funciona, pero urllib2.urlopen no

import urllib, urllib2 
print urllib.urlopen("http://127.0.0.1").read() # prints "running" 
print urllib2.urlopen("http://127.0.0.1").read() # throws an exception 

Aquí está el seguimiento de la pila:

Traceback (most recent call last): 
    File "urltest.py", line 5, in <module> 
    print urllib2.urlopen("http://127.0.0.1").read() 
    File "C:\Python25\lib\urllib2.py", line 121, in urlopen 
    return _opener.open(url, data) 
    File "C:\Python25\lib\urllib2.py", line 380, in open 
    response = meth(req, response) 
    File "C:\Python25\lib\urllib2.py", line 491, in http_response 
    'http', request, response, code, msg, hdrs) 
    File "C:\Python25\lib\urllib2.py", line 412, in error 
    result = self._call_chain(*args) 
    File "C:\Python25\lib\urllib2.py", line 353, in _call_chain 
    result = func(*args) 
    File "C:\Python25\lib\urllib2.py", line 575, in http_error_302 
    return self.parent.open(new) 
    File "C:\Python25\lib\urllib2.py", line 380, in open 
    response = meth(req, response) 
    File "C:\Python25\lib\urllib2.py", line 491, in http_response 
    'http', request, response, code, msg, hdrs) 
    File "C:\Python25\lib\urllib2.py", line 418, in error 
    return self._call_chain(*args) 
    File "C:\Python25\lib\urllib2.py", line 353, in _call_chain 
    result = func(*args) 
    File "C:\Python25\lib\urllib2.py", line 499, in http_error_default 
    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp) 
urllib2.HTTPError: HTTP Error 504: Gateway Timeout 

¿Alguna idea? Podría terminar necesitando algunas de las funciones más avanzadas de urllib2, así que no quiero simplemente recurrir al uso de urllib, además quiero entender este problema.

Respuesta

16

Parece que tienes la configuración del proxy definida que urllib2 está recogiendo sucesivamente. Cuando intenta representar "127.0.0.01/", el proxy se da por vencido y devuelve un error 504.

De Obscure python urllib2 proxy gotcha:

proxy_support = urllib2.ProxyHandler({}) 
opener = urllib2.build_opener(proxy_support) 
print opener.open("http://127.0.0.1").read() 

# Optional - makes this opener default for urlopen etc. 
urllib2.install_opener(opener) 
print urllib2.urlopen("http://127.0.0.1").read() 
+0

Esto solucionó el problema, aunque no tengo idea de cómo o por qué pensó usar un proxy, ya que mi script solo tenía tres líneas y no tengo variables de entorno que indiquen nada sobre ningún proxy. Aún así, es bueno tener esto resuelto, así que gracias por la ayuda. –

+0

La instancia de OpenerDirector no tiene el atributo 'urlopen' - necesita cambiar el fragmento anterior para que sea abridor.open (... – ryan

1

¿Llamar a urlib2.open primero seguido de urllib.open tiene los mismos resultados? ¿Me pregunto si la primera llamada para abrir está causando que el servidor http se ocupe causando el tiempo de espera?

+0

No, urllib2 obtiene el error independientemente de si se llama primero, y urllib nunca recibe el error incluso cuando se lo llama varias veces. Buenos pensamientos sin embargo. –

1

Sé que esta respuesta es una mierda, pero "funciona bien en mi máquina" (WinXP con Python 2.5.2)

+0

También estoy corriendo en Windows XP con Python 2.5.2, así que eso es interesante. Gracias por darle una oportunidad. –

1

No sé lo que está pasando, pero es posible encontrar este útil para averiguarlo:

>>> import urllib2 
>>> urllib2.urlopen('http://mit.edu').read()[:10] 
'<!DOCTYPE ' 
>>> urllib2._opener.handlers[1].set_http_debuglevel(100) 
>>> urllib2.urlopen('http://mit.edu').read()[:10] 
connect: (mit.edu, 80) 
send: 'GET/HTTP/1.1\r\nAccept-Encoding: identity\r\nHost: mit.edu\r\nConnection: close\r\nUser-Agent: Python-urllib/2.5\r\n\r\n' 
reply: 'HTTP/1.1 200 OK\r\n' 
header: Date: Tue, 14 Oct 2008 15:52:03 GMT 
header: Server: MIT Web Server Apache/1.3.26 Mark/1.5 (Unix) mod_ssl/2.8.9 OpenSSL/0.9.7c 
header: Last-Modified: Tue, 14 Oct 2008 04:02:15 GMT 
header: ETag: "71d3f96-2895-48f419c7" 
header: Accept-Ranges: bytes 
header: Content-Length: 10389 
header: Connection: close 
header: Content-Type: text/html 
'<!DOCTYPE ' 
1

urllib.urlopen() lanza la petición siguiente en el servidor:

GET/HTTP/1.0 
Host: 127.0.0.1 
User-Agent: Python-urllib/1.17 

mientras urllib2.urlopen() lanza la siguiente:

GET/HTTP/1.1 
Accept-Encoding: identity 
Host: 127.0.0.1 
Connection: close 
User-Agent: Python-urllib/2.5 

Por lo tanto, su servidor no comprende HTTP/1.1 o los campos de encabezado adicionales.

Cuestiones relacionadas