Cron在本地正常,但部署到Appengine后不行
我在本地用Python设置了一个定时任务(cron job),在本地运行得很好,但当我把它部署到App Engine上后,就不再工作了。
pl = db.Query(Venue).order("id")
list = pl.fetch(limit=0)
for p in pl:
base_url = 'http://search.twitter.com/search.json?rpp=100&q=4sq.com/'
query = p.twitter_ID
url_string = base_url + query
json_text = fetch(url_string)
json_response = simplejson.loads(json_text.content)
result = json_response['results']
for f in result:
user = f['from_user']
print user
在本地一切正常,但在服务器上我遇到了以下错误:
'results' 回溯(最近的调用在最前面): 文件 "/base/python_runtime/python_lib/versions/1/google/appengine/ext/webapp/init.py",第 515 行,在 call 中, handler.get(*groups) 文件 "/base/data/home/apps/hoosheer/4.347697940058059704/hoosheer_main.py",第 199 行,在 get 中, result = json_response['results'] KeyError: 'results'
在我部署第二个版本之前,这个功能是可以正常工作的。有没有办法解决这个问题?
1 个回答
JSON中的'results'
字段没有返回,是因为Twitter对每个IP地址允许的请求次数已经达到了最大限制; 这就是为什么你在国内的IP地址上没有问题,也没有收到HTTP 420的错误代码。
不幸的是,Google App Engine使用的是一组共享的IP地址*来发送请求,而Twitter的搜索API不支持身份验证。
搜索API的请求限制
对搜索API(在search.twitter.com上托管)的请求不会计入REST API的限制。不过,来自同一个IP地址的所有请求都会受到搜索请求限制的影响。搜索请求限制并没有公开,以避免不必要的搜索使用和滥用,但它的限制比REST请求限制要高。我们认为搜索请求限制对于大多数应用来说是相对宽松和足够的,很多应用开发者也发现这个限制适合他们的需求。
这就迫使你认真考虑Google App Engine是否适合你的应用。
*我在这里遇到过同样的问题,但幸运的是,API的开发者启用了一个身份验证机制,允许来自同一IP的认证请求。