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:                      
   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 разбрах, че сървърът му bcause не е отговорил в определеното време и можем да се справим с изключението ..съм, но не можем да го направим. Всяка помощ ще бъде оценена. Благодаря ти за помощта


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 е само 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() функция.Опитването по-горе не работи fr urllib2.urlopen () - person bitanalyzer; 24.06.2011

Както казахте, грешката възниква, защото не сте получили отговор навреме и заявката е изтекла крайния срок.

Това, което можете да направите, е да преместите заявката в опашка със задачи, тъй като задачите могат да се изпълняват много по-дълго.

Що се отнася до улавянето на изключението, опитвали ли сте да добавите израз за връщане веднага след self.redirect?

person Andz    schedule 23.06.2011
comment
не, просто го пренасочих към клас за грешка, но по-рано се опитах да отпечатам обекта e, но не отпечатвах нищо... (това означава, че не влизаше в блока освен) - person bitanalyzer; 23.06.2011