Почему эта ошибка от 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. Может существовать другая разница между кодом, который работает, и тем, что генерирует сообщение об ошибке.
Спасибо
Update
Как указано в ответе, вместо этого используется следующее использование 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)
Ответы
Ответ 1
Кажется, это ошибка в 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
, которая затем пытается взаимодействовать с определенной версией GAE urllib
(google/appengine/dist27/urllib.py
).
Ответ 2
Потерять 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'}
>>>
data = Нет
>>>
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()
>>>
данные
и он правильно напечатает данные. Вот мой результат:
![pomxr.png]()