App Engine:urlfetch的替代品?似乎非常不可靠

Don*_*Don 7 google-app-engine urlfetch

我在我的应用程序中使用urlfetch,虽然在开发环境中一切都运行良好,但我发现urlfetch在实际部署时非常不可靠.有时它可以正常工作(检索数据),但几分钟之后它可能什么也没有返回,然后在几分钟之后再次正常工作.这是非常不可接受的.我已经检查过以确保它不是问题的源URL(YQL),而且,一切都在开发环境中正常工作.

我可以试试第三方图书馆吗?

示例代码:

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'
Run Code Online (Sandbox Code Playgroud)

有时它会按预期工作,但有时候 - 完全随机而没有代码更改 - 我会得到这个错误:

a = r['query']['results']
TypeError: 'NoneType' object is unsubscriptable
Run Code Online (Sandbox Code Playgroud)

sys*_*out 11

有时它会按预期工作,但有时完全随机,没有代码更改

这是您的应用程序的请求超出Yahoo API调用速率限制的常见症状.

引用雅虎开发者文档的速率限制:

基于IP的限制

我们的服务速率限制是对特定时间窗口内每个IP地址的API调用数量的限制.如果您的IP地址在此期间发生变化,您可能会发现自己有更多的"信用".但是,如果其他人一直在使用该地址并达到限制,则您需要等到该时间段结束才能进行更多API调用.

Google App Engine使用IP地址池来处理传出的urlfetch请求,并且您的应用程序正在与调用同一Yahoo端点的其他应用程序共享这些IP地址.超过速率限制时,端点将回复超出限制的错误,导致UrlFetch失败.
这里使用Twitter搜索API的另一种情况.

当您混合使用Google App Engine +第三方Web API时,您需要确保API提供经过身份验证的调用,从而允许您的应用程序拥有自己的配额(例如StackApps API).


Nic*_*son 0

这不是 URLFetch 中的错误 - 这是返回的 JSON 的问题。要么json.loads返回 None,要么r['query']是 - 我猜可能是后者。尝试记录result.content以查看服务返回的内容。您可能还想检查一下result.status

一种可能是您的请求在生产中被雅虎拒绝或受到速率限制,但在您的开发计算机上却没有。