2011-01-27 10 views
5

Sto usando urlfetch nella mia app e mentre tutto funziona perfettamente nell'ambiente di sviluppo, sto trovando urlfetch essere MOLTO inaffidabile quando è effettivamente distribuito. A volte funziona come dovrebbe (recuperando i dati), ma dopo qualche minuto potrebbe non restituire nulla, quindi funzionerà di nuovo bene qualche minuto dopo. Questo è assolutamente inaccettabile. Ho controllato per assicurarsi che NON sia l'URL di origine che è il problema (YQL) e, ancora, tutto funziona come dovrebbe nell'ambiente di sviluppo.App Engine: alternative a urlfetch? Sembra molto inaffidabile

Esistono librerie di terze parti che potrei provare?

codice Esempio:

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' 

volte che funzionerà come dovrebbe, ma altre volte - completamente in modo casuale, senza modifiche al codice - Prendo questo questo errore:

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

Inaffidabile come? Cosa fa quando non funziona? –

+0

@Nick Modifica con un esempio sopra. – Don

risposta

0

Questo non è un errore in URLFetch - è un problema con il JSON che viene restituito. O json.loads restituisce None o r['query'] is - Immagino che sia probabilmente il secondo. Prova a registrare result.content per vedere che cosa sta restituendo il servizio. Probabilmente vorrai anche fare il ce.

Una possibilità è che la richiesta venga rifiutata o ratificata da Yahoo in produzione, ma non sul computer di sviluppo.

+0

Hm, mi restituisce alcuni json ma senza dati. Ho controllato i limiti di velocità di YQL ed è 1.000 all'ora, non mi sto avvicinando a quello. – Don

+0

@Don Stai usando qualche tipo di chiave API? Yahoo può limitare l'IP e le app di App Engine condividono un pool di IP per le richieste in uscita. –

+0

No, sto usando l'API pubblica. Registrerò una chiave e eseguirò qualche altro test. – Don

11

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

Questo è un sintomo comune che le richieste dell'applicazione hanno superato il limite di frequenza delle chiamate di Yahoo API.

Citando limite Yahoo developer documentations rate:

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 utilizza un pool di indirizzi IP per le richieste UrlFetch in uscita e l'applicazione è la condivisione di questi indirizzi IP con altre applicazioni che chiedono lo stesso endpoint di Yahoo; quando viene superato il limite di velocità, l'endpoint risponde con un limite superato l'errore provocando l'esito negativo di UrlFetch.
Here un altro caso utilizzando l'API di ricerca di Twitter.

Quando si mescolano Google App Engine + API Web di terze parti, è necessario assicurarsi che l'API fornisca chiamate autenticate che consentono all'applicazione di avere una propria quota (ad esempio StackApps API).

+1

ottima risposta! – Alfred

+0

Uso gAppProxy su appengine come server proxy, ma l'IP in uscita appengine è cambiato 3 volte in 10 minuti, in modo che alcuni siti Web chiudano la sessione di accesso – diyism

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