4

私のアプリケーションでは、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から、bcauseサーバーが指定された時間内に応答しなかったことがわかりました。例外..amは処理できますが、処理できません。どんな助けでもいただければ幸いです。ご協力ありがとうございました

4

2 に答える 2

12

urlfetchURLフェッチリクエストのデフォルトのタイムアウトはわずか5秒なので、直接使用してタイムアウトを増やすことをお勧めします。

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')

とにかくそれを超えることが常にある場合は、非同期リクエストを使用するか、ロジックをタスクキューに移動することを検討してください。

于 2011-06-23T12:03:42.377 に答える
0

おっしゃるように、時間内に応答がなく、リクエストが期限を超えたためにエラーが発生します。

タスクははるかに長く実行される可能性があるため、できることはリクエストをタスクキューに移動することです。

例外のキャッチに関しては、self.redirectの直後にreturnステートメントを追加してみましたか?

于 2011-06-23T11:10:55.013 に答える