DeadlineExceededError: ApplicationError: 5 при использовании функции urllib2.urlopen()

В моем приложении я использую функцию urllib2.urlopen() для вызова API и получения результата от этого API. Но это не работает нормально. Иногда он показывает результат, но иногда выдает следующую ошибку:

Traceback (most recent call last):
  File "/base/python_runtime/python_lib/versions/1/google/appengine/ext/webapp/__init__.py", line 700, in __call__
handler.get(*groups)
  File "/base/data/home/apps/s~malware-app/7.351334968546050391/main.py", line 505, in get
f = urllib2.urlopen('http://whoapi.com/api-v1/?domain=%s&rtype=alexarank&apikey=xyz'% domain)
  File "/base/python_runtime/python_dist/lib/python2.5/urllib2.py", line 124, in urlopen
    return _opener.open(url, data)
  File "/base/python_runtime/python_dist/lib/python2.5/urllib2.py", line 381, in open
response = self._open(req, data)
  File "/base/python_runtime/python_dist/lib/python2.5/urllib2.py", line 399, in _open
  '_open', req)
  File "/base/python_runtime/python_dist/lib/python2.5/urllib2.py", line 360, in _call_chain
result = func(*args)
  File "/base/python_runtime/python_dist/lib/python2.5/urllib2.py", line 1114, in http_open
return self.do_open(httplib.HTTPConnection, req)
  File "/base/python_runtime/python_dist/lib/python2.5/urllib2.py", line 1087, in do_open
r = h.getresponse()
  File "/base/python_runtime/python_dist/lib/python2.5/httplib.py", line 197, in getresponse
self._allow_truncated, self._follow_redirects)
  File "/base/python_runtime/python_lib/versions/1/google/appengine/api/urlfetch.py", line 260, in fetch
return rpc.get_result()
  File "/base/python_runtime/python_lib/versions/1/google/appengine/api/apiproxy_stub_map.py", line 592, in get_result
return self.__get_result_hook(self)
  File "/base/python_runtime/python_lib/versions/1/google/appengine/api/urlfetch.py", line 364, in _get_fetch_result
raise DeadlineExceededError(str(err))
DeadlineExceededError: ApplicationError: 5 

Я видел метод try-except для этого, но он не работает для моего кода. Мой блок кода:

 try:                      
   f = urllib2.urlopen('http://whoapi.com/api-v1/?domain=%s&rtype=serverip&apikey=xyzxyz'% domain)
   ip = f.read()
 except DeadlineExceededError, e:
   self.redirect('/error')

Я импортирую:

from google.appengine.runtime import DeadlineExceededError

Из stackoverflow я понял, что его сервер не ответил в указанное время, и мы можем обработать исключение ..am, но не можем этого сделать. Любая помощь будет оценена по достоинству. спасибо за помощь


person bitanalyzer    schedule 23.06.2011    source источник
comment
возможный дубликат Невозможно обработать DeadlineExceededError при использовании UrlFetch   -  person Wooble    schedule 23.06.2011
comment
Пожалуйста, не отправляйте перенаправления при ошибке — просто отправьте сообщение об ошибке 500 прямо здесь и сейчас.   -  person Nick Johnson    schedule 24.06.2011


Ответы (2)


Тайм-аут по умолчанию для запросов URL Fetch составляет всего 5 секунд, поэтому вы можете увеличить его, используя urlfetch напрямую:

from google.appengine.api import urlfetch

try:
    resp = urlfetch.fetch('http://whoapi.com/api-v1/?domain=%s&rtype=serverip&apikey=xyzxyz'% domain, method=urlfetch.GET, deadline=10)
    ip = r.content
except urlfetch.DownloadError:
    self.redirect('/error')

Если вы все равно постоянно обнаружите превышение, рассмотрите возможность использования асинхронных запросов или перемещения логика очереди задач.

person Xion    schedule 23.06.2011
comment
спасибо всем за ваши ответы ... я делаю 4 запроса urllib2.urlopen () в моем одном классе ... 2 вызова отлично работают с urlfetch () {с увеличенным временем}, но другие 2 не получают данные с помощью метод urlfetch ... поэтому нужно использовать urllib2.urlopen() {есть идеи, почему это произошло.???}. Любая идея обработать ошибку для функции urllib2.urlopen(). Вышеупомянутая попытка-кроме не работает для urllib2.urlopen () - person bitanalyzer; 24.06.2011

Как вы сказали, ошибка возникает из-за того, что вы не получили ответ вовремя, а срок запроса истек.

Что вы можете сделать, так это переместить запрос в очередь задач, так как задачи могут выполняться гораздо дольше.

Что касается перехвата исключения, пробовали ли вы добавить оператор return сразу после self.redirect?

person Andz    schedule 23.06.2011
comment
нет, я просто перенаправил его в класс ошибок, но раньше я пытался напечатать объект e, но ничего не печатал... (это означает, что он не попадал внутрь блока исключений) - person bitanalyzer; 23.06.2011