App Engine: альтернативы urlfetch? Кажется очень ненадежным - PullRequest
7 голосов
/ 28 января 2011

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

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

Пример кода:

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

Ответы [ 3 ]

11 голосов
/ 28 января 2011

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

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

Цитирование Документация для разработчиков Yahoo ограничение скорости:

Ограничения на основе IP

Наши ограничения на обслуживание устанавливаются какограничение на количество вызовов API, выполненных на IP-адрес в течение определенного временного окна.Если ваш IP-адрес изменится в течение этого периода времени, вы можете получить больше доступных кредитов.Однако, если кто-то еще использовал адрес и достиг предела, вам нужно подождать до конца периода времени, чтобы иметь возможность делать больше вызовов API.

Google App Engine используетпул IP-адресов для исходящих запросов urlfetch, и ваше приложение делится этими IP-адресами с другими приложениями, которые вызывают ту же конечную точку Yahoo;при превышении лимита скорости конечная точка отвечает с ошибкой превышен предел , приводящий к сбою UrlFetch.
Здесь другой случай с использованием API поиска Twitter.

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

1 голос
/ 03 июля 2016
import urllib2
response = urllib2.urlopen('http://python.org/')
html = response.read()
0 голосов
/ 28 января 2011

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

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

...