2008-10-14 15 views
11

Mam prostą stronę, którą testuję. Działa na localhost i mogę uzyskać do niego dostęp w mojej przeglądarce. Strona indeksu jest po prostu słowem "running". urllib.urlopen wyświetli stronę z powodzeniem, ale urllib2.urlopen nie będzie. Oto skrypt, który demonstruje problem (to jest rzeczywisty scenariusz, a nie uproszczenie innego skryptu testowego):urllib.urlopen działa, ale urllib2.urlopen nie ma

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 

Oto ślad stosu:

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 

Jakieś pomysły? Mogę skończyć wymagając bardziej zaawansowanych funkcji urllib2, więc nie chcę po prostu uciekać się do korzystania z urllib, a także chcę zrozumieć ten problem.

Odpowiedz

16

Brzmi jak masz zdefiniowane ustawienia serwera proxy, który urllib2 jest podniesienie dalej. Kiedy próbuje proxy "127.0.0.01/", proxy rezygnuje i zwraca błąd 504.

Od 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

Rozwiązało to problem, chociaż nie mam pojęcia, jak i dlaczego miał używać proxy, ponieważ mój skrypt miał tylko trzy wiersze i nie mam żadnych zmiennych środowiskowych, które wskazywałyby na jakiekolwiek proxy. Mimo to dobrze jest to rozwiązać, dlatego dziękuję za pomoc. –

+0

Instancja OpenerDirector nie ma atrybutu "urlopen" - należy zmienić powyższy fragment na opener.open (... – ryan

1

Czy wywołanie najpierw urlib2.open, a następnie urllib.open daje takie same wyniki? Zastanawiasz się tylko, czy pierwsze połączenie z serwerem http jest zbyt obciążające, powodując przekroczenie limitu czasu?

+0

Nie, urllib2 otrzymuje błąd niezależnie od tego, czy jest on wywoływany jako pierwszy, a urllib nigdy nie otrzymuje błędu, nawet jeśli jest wywoływany wiele razy. Dobre myśli. –

1

wiem, ta odpowiedź jest do bani, ale „to działa dobrze na moim komputerze” (WinXP z Python 2.5.2)

+0

Używam również systemu Windows XP z Pythonem 2.5.2, więc to jest interesujące. Dzięki za oddanie strzału. –

1

Nie wiem co się dzieje, ale może okazać się pomocne w zastanawianie go:

>>> 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() zgłasza następującą prośbę na serwerze:

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

podczas urllib2.urlopen() wyrzuca to:

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

Twój serwer nie rozumie HTTP/1.1 lub dodatkowych pól nagłówka.

Powiązane problemy