2011-08-10 16 views
7

En Python puedo usar urllib2 (y urllib) para abrir URL externas como Google. Sin embargo, estoy teniendo problemas al abrir URL de localhost. Tengo un Python SimpleHTTPServer ejecutándose en el puerto 8280, que puedo buscar con éxito usando http://localhost:8280/.Python urllib y urllib2 no abren URL de localhost?

python -m SimpleHTTPServer 8280 

Es también digno de mención que estoy con Ubuntu que tiene CNTLM corriendo para manejar la autenticación a nuestro proxy web corporativa. Por lo tanto, wget en realidad no funciona con localhost, ¡así que no creo que esto sea un problema de urllib!

script de prueba (test_urllib2.py):

import urllib2 

print "Opening Google..." 
google = urllib2.urlopen("http://www.google.com/") 
print google.read(100) 
print "Google opened." 

print "Opening localhost..." 
localhost = urllib2.urlopen("http://localhost:8280/") 
print localhost.read(100) 
print "localhost opened." 

Salida:

$ ./test_urllib2.py 
Opening Google... 
<!doctype html><html><head><meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">< 
Google opened. 
Opening localhost... 
Traceback (most recent call last): 
    File "./test_urllib2.py", line 10, in <module> 
    localhost = urllib2.urlopen("http://localhost:8280/") 
    File "/usr/lib/python2.6/urllib2.py", line 126, in urlopen 
    return _opener.open(url, data, timeout) 
    File "/usr/lib/python2.6/urllib2.py", line 397, in open 
    response = meth(req, response) 
    File "/usr/lib/python2.6/urllib2.py", line 510, in http_response 
    'http', request, response, code, msg, hdrs) 
    File "/usr/lib/python2.6/urllib2.py", line 429, in error 
    result = self._call_chain(*args) 
    File "/usr/lib/python2.6/urllib2.py", line 369, in _call_chain 
    result = func(*args) 
    File "/usr/lib/python2.6/urllib2.py", line 605, in http_error_302 
    return self.parent.open(new, timeout=req.timeout) 
    File "/usr/lib/python2.6/urllib2.py", line 391, in open 
    response = self._open(req, data) 
    File "/usr/lib/python2.6/urllib2.py", line 409, in _open 
    '_open', req) 
    File "/usr/lib/python2.6/urllib2.py", line 369, in _call_chain 
    result = func(*args) 
    File "/usr/lib/python2.6/urllib2.py", line 1161, in http_open 
    return self.do_open(httplib.HTTPConnection, req) 
    File "/usr/lib/python2.6/urllib2.py", line 1134, in do_open 
    r = h.getresponse() 
    File "/usr/lib/python2.6/httplib.py", line 986, in getresponse 
    response.begin() 
    File "/usr/lib/python2.6/httplib.py", line 391, in begin 
    version, status, reason = self._read_status() 
    File "/usr/lib/python2.6/httplib.py", line 355, in _read_status 
    raise BadStatusLine(line) 
httplib.BadStatusLine 

Solución: el problema era de hecho porque estoy utilizando CNTLM detrás de nuestro proxy web corporativa (detalles de por qué esto causó un problema, no estoy seguro). La solución fue usar el ProxyHandler:

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

Gracias a loki2302 por señalarme here.

+2

no use 'excepto:' sin excepción y por favor, nos muestran la excepción planteada por 'urllib2.urlopen'. – mouad

+5

http://stackoverflow.com/questions/201515/urllib-urlopen-works-but-urllib2-urlopen-doesnt – agibalov

+0

La excepción 'BadStatusLine' sugiere un encabezado de respuesta mal formado del servidor. ¿Podrías echar un vistazo y ver qué se devuelve? –

Respuesta

2

Compruebe si el problema es realmente en la apertura de localhost, o si JBoss da respuesta no válida (que el navegador de alguna manera funciona alrededor):

  1. intente utilizar http://127.0.0.1:8280/ vez de "localhost: 8280" (si eso funciona, es un problema de DNS)
  2. use curl o wget para probar JBoss funciona: wget http://localhost:8280/
  3. puede intentar ejecutar un simple servidor HTTP de Python para probar en contra de algo que no sea JBoss:

    python -m SimpleHTTPServer 8280 
    
+0

Excelente idea. ¡Wget no funciona! Estoy usando Ubuntu que tiene CNTLM en ejecución para manejar la autenticación a nuestro proxy web corporativo, por lo que esta debe ser la raíz del problema. He actualizado mi pregunta en consecuencia. ¿Algunas ideas? – ryan

+0

Parece que tienes un conjunto de proxy que también se usa para localhost/127.0.0.1. Dependiendo de cómo esté configurado (no sé sobre CNTLM), es posible hacer una excepción para localhost. –

+0

Además, el enlace por loki2302 en los comentarios de pregunta puede ser útil, contiene una receta sobre cómo ignorar la configuración del proxy, por lo que (a menos que tenga un proxy transparente o forzado de alguna otra manera) puede ayudarle. –

2

intente utilizar urllib:

import urllib 
localhost = urllib.urlopen("http://localhost:8280/") 
print localhost.read(100) 
1

También tuve este problema en mi servidor web. Pero la raíz del problema fue que mi servidor web era de un solo hilo y solo puede responder a una solicitud. Así que durante el proceso de una petición que no puede responder a otra URL Pregunté en urllib2

Cuestiones relacionadas