2011-08-10 16 views
7

Trong Python, tôi có thể sử dụng urllib2 (và urllib) để mở các URL bên ngoài như Google. Tuy nhiên, tôi đang gặp vấn đề khi mở URL localhost. Tôi có một SimplethonTPServer python chạy trên cổng 8280 mà tôi có thể duyệt đến thành công bằng cách sử dụng http://localhost:8280/.Python urllib và urllib2 không mở URL localhost?

python -m SimpleHTTPServer 8280 

Điều đáng lưu ý là tôi đang chạy Ubuntu có CNTLM chạy để xử lý xác thực cho proxy web công ty của chúng tôi. Vì vậy, wget không thực sự làm việc với localhost, vì vậy tôi không nghĩ rằng đây là một vấn đề urllib!

Script Test (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." 

Output:

$ ./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 

SOLUTION: Vấn đề là thực sự vì tôi đang sử dụng CNTLM đằng sau proxy web của công ty chúng tôi (chi tiết cụ thể về việc tại sao điều này gây ra một vấn đề tôi không thể chắc chắn). Giải pháp là sử dụng ProxyHandler:

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

Nhờ loki2302 chỉ cho tôi here.

+2

không sử dụng 'ngoại trừ:' không có Ngoại lệ và vui lòng hiển thị cho chúng tôi ngoại lệ do 'urllib2.urlopen' đưa ra. – mouad

+5

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

+0

Ngoại lệ 'BadStatusLine' cho thấy tiêu đề phản hồi không đúng định dạng từ máy chủ. Bạn có thể có một cái nhìn và xem những gì đang được trả lại? –

Trả lời

2

Kiểm tra xem vấn đề thực sự là trong mở localhost, hoặc cho dù JBoss cho phản ứng không hợp lệ (mà trình duyệt bằng cách nào đó làm việc xung quanh):

  1. hãy thử sử dụng http://127.0.0.1:8280/ thay của "localhost: 8280" (nếu nó hoạt động, đó là vấn đề DNS)
  2. sử dụng curl hoặc wget để kiểm tra công trình JBoss: wget http://localhost:8280/
  3. bạn có thể thử chạy một máy chủ Python HTTP đơn giản để kiểm tra chống lại một cái gì đó khác hơn là JBoss:

    python -m SimpleHTTPServer 8280 
    
+0

Ý tưởng tuyệt vời. Wget không hoạt động! Tôi đang sử dụng Ubuntu trong đó có CNTLM chạy để xử lý xác thực cho proxy web của công ty chúng tôi, vì vậy đây phải là gốc của vấn đề. Tôi đã cập nhật câu hỏi của mình cho phù hợp. Bất kỳ ý tưởng? – ryan

+0

Có vẻ như bạn đã có bộ proxy cũng được sử dụng cho localhost/127.0.0.1. Tùy thuộc vào cách nó được thiết lập (Tôi không biết về CNTLM), nó có thể có thể làm cho một ngoại lệ cho localhost. –

+0

Ngoài ra, liên kết của loki2302 trong các bình luận câu hỏi có thể hữu ích, nó có chứa một công thức về cách bỏ qua các thiết lập proxy, vì vậy (trừ khi bạn có proxy trong suốt hoặc bị buộc theo cách khác) nó có thể giúp bạn. –

2

hãy thử sử dụng urllib:

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

Tôi cũng có vấn đề này trong máy chủ web của tôi. Nhưng gốc rễ của vấn đề là máy chủ web của tôi là chủ đề duy nhất và chỉ có thể trả lời một yêu cầu. Vì vậy, trong quá trình yêu cầu, nó không thể trả lời một url khác mà tôi đã yêu cầu trong urllib2