2011-05-04 6 views
5

종종 GAE는 파일을 업로드 할 수 없습니다 나는 다음과 같은 오류가 점점 오전 :오류가 발생하면 urlfetch.fetch를 몇 번 더 다시 시도 하시겠습니까?

ApplicationError: 2 
Traceback (most recent call last): 
    File "/base/python_runtime/python_lib/versions/1/google/appengine/ext/webapp/__init__.py", line 636, in __call__ 
    handler.post(*groups) 
    File "/base/data/home/apps/picasa2vkontakte/1.348093606241250361/picasa2vkontakte.py", line 109, in post 
    headers=headers 
    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 355, in _get_fetch_result 
    raise DownloadError(str(err)) 
DownloadError: ApplicationError: 2 

어떻게 같은 오류가 발생하는 경우에 재 시도를 수행해야합니까?

 try: 
      result = urlfetch.fetch(url=self.request.get('upload_url'), 
            payload=''.join(data), 
            method=urlfetch.POST, 
            headers=headers 
            ) 
     except DownloadError: 
      # how to retry 2 more times? 
     # and how to verify result here? 

답변

9

가능한 경우이 작업을 the task queue으로 옮기십시오. 작업이 실패하면 자동으로 다시 시도합니다. 계속 실패하면 시스템은 재시도 빈도를 점차적으로 1 시간에 한 번 낮 춥니 다. 이는 일회성 재시도 논리를 구현하지 않고도 속도 제한 서비스에 대한 API 요청을 처리하는 쉬운 방법입니다. 당신이 정말로 기적으로 요청을 처리해야하는 경우

,이 같은 작업을해야합니다 : 당신은 또한 기본 시간 제한 기한을 두 배로 urlfetch.fetch하는 deadline=10를 전달할 수 있습니다

for i in range(3): 
    try: 
    result = urlfetch.fetch(...) 
    # run success conditions here 
    break 
    except DownloadError: 
    #logging.debug("urlfetch failed!") 
    pass 

.

+0

감사합니다. @Drew Sears. 'status_code'를 확인하는 것이 맞을까요? if result.status_code == 200 : break'? –

+0

필요하지 않아야합니다. fetch가 실패 코드 (404, 500)를 반환하면 예외가 throw되고 break를 포함하여 try 블록의 아무 것도 실행되지 않습니다. –

관련 문제