Cron在本地正常,但部署到Appengine后不行

3 投票
1 回答
714 浏览
提问于 2025-04-16 10:10

我在本地用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 个回答

3

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的认证请求。

撰写回答