2014-09-29 1 views
1

У меня есть этот код в верхней части моего Google App программы двигателя:HttpException: Срок превышено время ожидания ответа HTTP от URL

from google.appengine.api import urlfetch 
urlfetch.set_default_fetch_deadline(60) 

Я использую нож, чтобы загрузить материал:

cj = CookieJar()   

    opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) 
    opener.addheaders = [ ('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64)') ] 

    resp = opener.open('http://www.example.com/') 

исключения бросок через 5 секунд:

File "/base/data/home/runtimes/python27/python27_dist/lib/python2.7/urllib2.py", line 404, in open 
    response = self._open(req, data) 
    File "/base/data/home/runtimes/python27/python27_dist/lib/python2.7/urllib2.py", line 422, in _open 
    '_open', req) 
    File "/base/data/home/runtimes/python27/python27_dist/lib/python2.7/urllib2.py", line 382, in _call_chain 
    result = func(*args) 
    File "/base/data/home/runtimes/python27/python27_dist/lib/python2.7/urllib2.py", line 1222, in https_open 
    return self.do_open(httplib.HTTPSConnection, req) 
    File "/base/data/home/runtimes/python27/python27_dist/lib/python2.7/urllib2.py", line 1187, in do_open 
    r = h.getresponse(buffering=True) 
    File "/base/data/home/runtimes/python27/python27_dist/lib/python2.7/gae_override/httplib.py", line 524, in getresponse 
    raise HTTPException(str(e)) 
HTTPException: Deadline exceeded while waiting for HTTP response from URL: http://www.example.com 

Как я могу избежать ошибок?

+0

Другой способ сделать это, если вы не можете сделать это в течение временного ограничения времени для запроса http, заключается в том, чтобы сделать работу [задачей] (https://cloud.google.com/appengine/docs/python/ taskqueue /) или [задание mapreduce] (https://code.google.com/p/appengine-mapreduce/). Эти два способа имеют более гибкие временные ограничения для методов и HTTP-запроса. У обычного HTTP-запроса hae есть ограничение на 15-20 секунд, поэтому, если вам нужны более трудоемкие задания, есть другие альтернативы. –

ответ

1

Вы пытались установить таймаут на вызов .open()?

resp = opener.open('http://example.com', None, 60) 

При достижении тайм-аута, как указано на set_default_fetch_deadline, Python будет бросать DownloadError или DeadlineExceededErrors исключение: https://cloud.google.com/appengine/docs/python/urlfetch/exceptions

+1

Нет, я не пробовал, но попробую! – Ginger

0

Вы также можете пропатчить библиотеку httplib2 и установить срок до 60 секунд

httplib2/__init__.py: 
     def fixed_fetch(url, payload=None, method="GET", headers={}, 
         allow_truncated=False, follow_redirects=True, 
         deadline=60): 
      return fetch(url, payload=payload, method=method, headers=headers, 
         allow_truncated=allow_truncated, 
         follow_redirects=follow_redirects, deadline=60, 
         validate_certificate=validate_certificate) 
     return fixed_fetch 

Это работа вокруг.