2011-01-27 3 views
5

Я использую urlfetch в своем приложении, и, хотя все работает отлично в среде разработки, я нахожу urlfetch ОЧЕНЬ ненадежной, когда она фактически развернута. Иногда он работает так, как должен (извлечение данных), но через несколько минут он ничего не может вернуть, после этого он будет работать нормально через несколько минут после этого. Это очень неприемлемо. Я проверил, чтобы убедиться, что это НЕ исходный URL-адрес, проблема (YQL), и, опять же, все работает так, как должно быть в среде разработки.App Engine: Альтернативы urlfetch? Кажется очень ненадежным

Есть ли сторонние библиотеки, которые я мог бы попробовать?

Пример кода:

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' 

Иногда он будет работать как надо, но иногда - совершенно случайно, без изменения кода - я получу эту эту ошибку:

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

Ненадежный как? Что он делает, когда он не работает? –

+0

@Nick Edit с образцом выше. – Don

ответ

0

Это не является ошибкой в ​​URLFetch - это проблема с возвратом JSON. Либо json.loads возвращается Нет, либо r['query'] - Я предполагаю, что это, вероятно, последний. Попробуйте выполнить регистрацию result.content, чтобы узнать, что возвращает служба. Вероятно, вы также захотите cehck result.status.

Возможно, существует вероятность того, что ваш запрос будет отклонен или изменен компанией Yahoo на производстве, но не на вашей машине разработки.

+0

Хм, он возвращает мне json, но без данных. Я проверил лимиты ставок YQL и это 1000 в час, я не приближаюсь к этому. – Don

+0

@Don Используете ли вы какой-либо ключ API? Yahoo может ограничивать IP, а приложения App Engine используют пул IP для исходящих запросов. –

+0

Нет, я использую общедоступный API. Я подпишусь на ключ и сделаю еще несколько тестов. – Don

11

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

Это распространенный признак того, что запросы вашего приложения превысили ограничение скорости вызовов API Yahoo.

Цитирование предел 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 использует пул IP-адресов для исходящих запросов UrlFetch и приложение делится эти адреса с другими приложениями, призывающих тот же Yahoo конечной точки; когда предел скорости превышен, конечная точка отвечает префиксом , превышающим, что приводит к ошибке UrlFetch.
Here другой случай с использованием API поиска в Twitter.

При смешивании API-интерфейсов Google App Engine + сторонних веб-интерфейсов необходимо убедиться, что API предоставляет аутентифицированные вызовы, позволяющие вашему приложению иметь собственную квоту (например, StackApps API).

+1

очень хороший ответ! – Alfred

+0

Я использую gAppProxy на appengine как прокси-сервер, но appengine исходящий IP изменен 3 раза за 10 минут, так что какой-то веб-сайт закроет мой логин – diyism

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

 Смежные вопросы

  • Нет связанных вопросов^_^