2011-01-27 10 views
5

Estoy usando urlfetch en mi aplicación y aunque todo funciona perfectamente bien en el entorno de desarrollo, estoy descubriendo que urlfetch es MUY poco confiable cuando se implementa. A veces funciona como debería (recuperar datos), pero luego unos minutos más tarde puede que no devuelva nada, y luego funcionará bien de nuevo unos minutos después de eso. Esto es muy inaceptable. Lo he comprobado para asegurarme de que NO es la URL de origen el problema (YQL) y, nuevamente, todo funciona como debería en el entorno de desarrollo.App Engine: ¿alternativas a urlfetch? Parece muy poco fiable

¿Hay alguna biblioteca de terceros que pueda probar?

código Ejemplo:

url = "http://query.yahooapis.com/v1/public/yql?q=%s&format=json" % urllib.quote_plus(query) 
result = urlfetch.fetch(url, deadline=10) 

if result.status_code == 200: 
    r = json.loads(result.content) 
else: 
    return 

a = r['query']['results'] 
# Do stuff with 'a' 

veces que va a trabajar como debe ser, pero otras veces - completamente al azar, sin cambios en el código - voy a conseguir este este error:

a = r['query']['results'] 
TypeError: 'NoneType' object is unsubscriptable 
+0

Unreliable cómo? ¿Qué hace cuando no funciona? –

+0

@Nick Editar con una muestra anterior. – Don

Respuesta

0

Este no es un error en URLFetch: es un problema con el JSON que se devuelve. O bien json.loads está regresando None, o r['query'] es - Supongo que es probablemente el último. Intente iniciar sesión en result.content para ver qué devuelve el servicio. Probablemente también quieras cehck result.status.

Una posibilidad es que su solicitud sea denegada o modificada por Yahoo en producción, pero no en su máquina de desarrollo.

+0

Hm, me devuelve algo de json pero sin datos. Revisé los límites de velocidad de YQL y es 1000 por hora, no me estoy acercando a eso. – Don

+0

@Don ¿Estás utilizando algún tipo de clave API? Yahoo puede limitar por IP, y las aplicaciones de App Engine comparten un grupo de IP para las solicitudes salientes. –

+0

No, estoy usando la API pública. Me registraré para obtener una clave y hacer más pruebas. – Don

11

Sometimes it'll work as it should, but other times completely randomly with no code changes

Este es un síntoma común de que las solicitudes de su aplicación han excedido el límite de la tasa de llamadas API de Yahoo.

Citando límite de velocidad de Yahoo developer documentations:

IP Based Limits

Our service rate limits are imposed as a limit on the number of API calls made per IP address during a specific time window. If your IP address changes during that time period, you may find yourself with more "credit" available. However, if someone else had been using the address and hit the limit, you'll need to wait until the end of the time period to be allowed to make more API calls.

Google App Engine utiliza un grupo de direcciones IP para las solicitudes de UrlFetch salientes y su aplicación está compartiendo estas direcciones IP con otras aplicaciones que están pidiendo el mismo punto final Yahoo; cuando se excede el límite de velocidad, el punto extremo responde con un límite de que excedió el error, lo que provocó la falla de UrlFetch.
Here otro caso utilizando la API de búsqueda de Twitter.

Al combinar API web de Google App Engine + de terceros, debe asegurarse de que la API proporcione llamadas autenticadas que permitan a su aplicación tener su propia cuota (StackApps API por ejemplo).

+1

muy buena respuesta! – Alfred

+0

Uso gAppProxy en appengine como servidor proxy, pero una IP saliente appengine cambió 3 veces en 10 minutos, por lo que algún sitio web cerrará mi sesión de inicio de sesión. – diyism

1
import urllib2 
response = urllib2.urlopen('http://python.org/') 
html = response.read()