python google-app-engine urlfetch

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



google-app-engine urlfetch (5)

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

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=<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 intento facebook_post_url en un navegador, vuelve instantáneamente.

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

¡Muchas gracias!


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 dev 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 cada vez. 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.


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

Como arreglar:

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


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 )