Почему эта ошибка от urllib?

При использовании urllib возникает странная ошибка:

INFO 2011-12-07 07:02:45,101 main.py:884] urlhttp://maps.googleapis.com/maps/api/geocode/json?latlng=59.3333,18.05&sensor=false WARNING 2011-12-07 07:02:45,103 urlfetch_stub.py:428] Stripped prohibited headers from URLFetch request: ['Host'] ERROR 2011-12-07 07:02:45,210 main.py:346] HTTPResponse instance has no attribute 'readline': Traceback (most recent call last): File "/media/Lexar/montao/lib/webapp2/webapp2.py", line 545, in dispatch return method(*args, **kwargs) File "/media/Lexar/montao/montaoproject/main.py", line 885, in get jsondata = json.load(urllib2.urlopen(url)) File "/usr/lib/python2.7/urllib2.py", line 126, in urlopen return _opener.open(url, data, timeout) File "/usr/lib/python2.7/urllib2.py", line 391, in open response = self._open(req, data) File "/usr/lib/python2.7/urllib2.py", line 409, in _open '_open', req) File "/usr/lib/python2.7/urllib2.py", line 369, in _call_chain result = func(*args) File "/usr/lib/python2.7/urllib2.py", line 1185, in http_open return self.do_open(httplib.HTTPConnection, req) File "/usr/lib/python2.7/urllib2.py", line 1176, in do_open resp = addinfourl(fp, r.msg, req.get_full_url()) File "/media/Lexar/montao/google/appengine/dist27/urllib.py", line 978, in __init__ addbase.__init__(self, fp) File "/media/Lexar/montao/google/appengine/dist27/urllib.py", line 926, in __init__ self.readline = self.fp.readline AttributeError: HTTPResponse instance has no attribute 'readline' 

Код, который использовался для работы

  url = 'http://maps.googleapis.com/maps/api/geocode/json' + \ '?latlng={},{}&sensor=false'.format(entity.geopt.lat, entity.geopt.lon) logging.info('url%s' % url) jsondata = json.load(urllib2.urlopen(url)) 

Не могли бы вы рассказать мне, что здесь не так? Я где-то читал, что объект ответа не имеет метода «get», а затем как он работает? Я считаю, что разница в том, что я обновился с предварительного SDK 1.6 до 1.6.1. Может существовать какая-то другая разница между кодом, который работает, и тем, что генерирует сообщение об ошибке.

спасибо

Обновить

Как указано в ответе, вместо этого используется следующее использование urlfetch:

  url = 'http://maps.googleapis.com/maps/api/geocode/json' + \ '?latlng={},{}&sensor=false'.format(entity.geopt.lat, entity.geopt.lon) logging.info('url%s' % url) from google.appengine.api import urlfetch result = urlfetch.fetch(url) jsondata = json.loads(result.content) 

Кажется, это ошибка в SDK. Я смог воспроизвести то же самое поведение. Есть ли причина, по которой вы используете urllib2 вместо urllib ?

Используя Python2.7 и SDK 1.6.1, я протестировал следующее:

 import urllib url = 'http://maps.googleapis.com/maps/api/geocode/json' + \ '?latlng={},{}&sensor=false'.format(entity.geopt.lat, entity.geopt.lon) logging.info('url%s' % url) jsondata = json.load(urllib.urlopen(url)) 

и он работал, как ожидалось.

Я буду следить за файлом, если я могу определить, что вызывает ошибку чтения файла.

ПРИМЕЧАНИЕ. Я протестировал код, предложенный KJuly, и он потерпел неудачу с той же ошибкой. Кажется, urllib2 полагается на urllib когда этого не должно быть. Копаем дальше.

EDIT: Поскольку urllib и urllib2 являются только обертками для urlfetch , я также могу предложить следующее:

 from google.appengine.api import urlfetch result = urlfetch.fetch(url) jsondata = json.loads(result.content) 

Второй EDIT: в любом случае мы используем локальную версию ( /usr/lib/python2.7/urllib2.py ) urllib2 , которая затем пытается взаимодействовать с конкретной версией urllib ( google/appengine/dist27/urllib.py ).

Метод Lose Request() ? Возможно, это сработает.

 headers = { 'Content-Type' : 'application/json' } // Maybe 'application/xml' data = None req = urllib2.Request(url, data, headers) resp = urllib2.urlopen(req) data = resp.read() jsondata = json.load(data) 

Я попытался в консоли python:

>>> import urllib2
>>> headers = {'Content-Type': 'application / json'}
>>> данные = нет
>>> req = urllib2.Request (" http://maps.googleapis.com/maps/api/geocode/json?latlng=59.3333,18.05&sensor=false ", данные, заголовки)
>>> response = urllib2.urlopen (req)
>>> data = response.read ()
>>> данные

и он правильно напечатает данные. Вот мой результат: