Question

Je teste un site Web simple. Il fonctionne sur localhost et je peux y accéder via mon navigateur Web. La page d'index est simplement le mot "en cours d'exécution". urllib.urlopen lira la page avec succès, mais urllib2.urlopen ne le fera pas. Voici un script qui illustre le problème (il s’agit du script lui-même et non d’une simplification d’un autre script de test):

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

Voici la trace de la pile:

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

Des idées? Il se peut que je finisse par avoir besoin de certaines des fonctionnalités les plus avancées de urllib2 , aussi je ne souhaite pas simplement utiliser urllib , et je souhaite également comprendre ce problème.

Était-ce utile?

La solution

On dirait que vous avez défini les paramètres de proxy sur lesquels urllib2 se connecte. Lorsqu’il tente d’exercer une procuration " 127.0.0.01/" ;, le mandataire abandonne et renvoie une erreur 504.

De Obscure du proxy urythib2 python Obtenu :

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()

Autres conseils

Est-ce que le fait d'appeler urlib2.open en premier suivi de urllib.open a les mêmes résultats? Vous vous demandez simplement si le premier appel à ouvrir est à l'origine de l'occupation du serveur http, ce qui entraîne l'expiration du délai?

Je ne sais pas ce qui se passe, mais vous trouverez peut-être cela utile pour comprendre:

>>> 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 '

urllib.urlopen () envoie la requête suivante au serveur:

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

tandis que urllib2.urlopen () lance ceci:

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

Votre serveur ne comprend donc pas HTTP / 1.1 ni les champs d'en-tête supplémentaires.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top