Почему эта ошибка от urllib? - PullRequest
10 голосов
/ 07 декабря 2011

Я получаю странную ошибку при использовании 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)

Ответы [ 2 ]

14 голосов
/ 07 декабря 2011

Это похоже на ошибку в 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, когда этого не должно быть.Копаем дальше.

РЕДАКТИРОВАТЬ: Поскольку urllib и urllib2 являются просто обертками для urlfetch, я мог бы также предложить следующее:

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

Второе РЕДАКТИРОВАНИЕ: В любом случае,мы используем локальную версию (/usr/lib/python2.7/urllib2.py) urllib2, которая затем пытается взаимодействовать с конкретной версией GAE urllib (google/appengine/dist27/urllib.py).

2 голосов
/ 07 декабря 2011

Потерять 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 ()
>>> данные

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

...