GAE – AppEngine – DeadlineExceededError: Fecha límite excedida mientras se espera la respuesta HTTP de la URL:

Tengo una aplicación Google AppEngine que funciona muy bien en mi máquina local. La aplicación publica una imagen (de un url) en mi muro de Facebook. Sin embargo, cuando lo despliegue en los servidores de Google, obtengo un error:

DeadlineExceededError: Deadline exceeded while waiting for HTTP response from URL: 

El código ofensivo es:

 facebook_access_token = facebook_info['access_token'] facebook_post_url = 'https://graph.facebook.com/me/photos?access_token=%s&url=%s&name=%s&method=post' % (facebook_access_token, url, caption) facebook_post_url = facebook_post_url.replace(" ", "+"); facebook_result = urlfetch.fetch(facebook_post_url) if facebook_result.status_code == 200: facebook_result_object = json.loads(facebook_result.content) output_ids['facebook'] = facebook_result_object['id'] else: output_ids['facebook'] = '' 

Y la traza de error completa es:

 Traceback (most recent call last): File "/base/python_runtime/python_lib/versions/1/google/appengine/ext/webapp/_webapp25.py", line 710, in __call__ handler.get(*groups) File "/base/data/home/apps/s~digibackapi/1.362663258877230387/main.py", line 512, in get facebook_result = urlfetch.fetch(facebook_post_url) File "/base/python_runtime/python_lib/versions/1/google/appengine/api/urlfetch.py", line 266, in fetch return rpc.get_result() File "/base/python_runtime/python_lib/versions/1/google/appengine/api/apiproxy_stub_map.py", line 604, in get_result return self.__get_result_hook(self) File "/base/python_runtime/python_lib/versions/1/google/appengine/api/urlfetch.py", line 404, in _get_fetch_result 'Deadline exceeded while waiting for HTTP response from URL: ' + url) DeadlineExceededError: Deadline exceeded while waiting for HTTP response from URL: https://graph.facebook.com/me/photos?access_token=&url=http://digiback.cc/ej7&name=Trees&method=post 

Una vez más, el código me parece sólido y funciona bien en mi máquina local. ¿Podría tener algo que ver con los tiempos de espera? Cuando bash facebook_post_url en un navegador, vuelve instantáneamente.

¿Alguien tiene alguna idea? Estoy aquí por completo.

    ¡Muchas gracias!

    Intente establecer la fecha límite para urlfetch en 30 segundos o más (dependiendo de si está llamando a urlfetch desde un controlador de tareas o un controlador de solicitudes)

    Más información sobre urlfetch: Url Fetch Docs

    Respuesta simple: el plazo predeterminado para la obtención de URL se establece en 5 segundos.

    Como arreglar:

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

    No estoy familiarizado con las API de Facebook. Pero la forma en que se construye el urlfetch parece un poco extraño. Normalmente, el método (Publicación) es un argumento urlfetch y la carga útil posterior está codificada en URL. Esto resulta en:

     params = urllib.urlencode([ ('access_token', facebook_access_token), ('url', url), ('name', caption), ]) response = urlfetch.fetch(url='https://graph.facebook.com/me/photos', payload=params, method=urlfetch.POST, headers={'Content-Type': 'application/x-www-form-urlencoded'}) 

    Posiblemente relacionado: estaba experimentando la misma fecha límite excedida al probar el código local de urlfetch. Resulta que si bien un GET directo de un recurso en el servidor de desarrollo a través de un navegador funcionaría, por ejemplo, http://localhost:8080/content/test.jpg , intentar lo mismo a través de urlfetch estaba condenado a fallar todas las veces. Solo puedo asumir que la recuperación de localhost, que se traduce a 127.0.0.1 en tiempo de ejecución, no es compatible con urlfetch .

    Resulta que el tuyo fue realmente un problema de tiempo de espera, mientras que mi respuesta es no usar urlfetch en dev.

    Una alternativa a establecer el plazo global es establecerlo en la llamada de recuperación específica. En tu caso:

     result = urlfetch.fetch( url=your_url, deadline=60 )