2011-01-27 5 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上記のサンプルを編集します。 – Don

答えて

0

これをURLFetchのエラーではありません。返されるJSONの問題です。 json.loadsは返されません。またはr['query']です - おそらく後者でしょうか。ログにはresult.contentを記録して、サービスが復帰していることを確認してください。あなたはおそらくresult.statusをセクしたいと思うでしょう。

1つの可能性は、あなたの要求が、生産マシンではYahooから拒否されているか、または評価されている可能性がありますが、開発マシンではありません。

+0

ええ、それは私にいくつかのjsonを返しますが、データはありません。私はYQLのレート制限をチェックしました。それは1時間当たり1,000です。私はそれに近づくつもりはありません。 – 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

これは、アプリケーションのリクエストがYahoo APIコールレート制限を超えたという一般的な症状です。

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は、発信のURLfetch要求に対してIPアドレスのプールを使用すると、アプリケーションが同じヤフーエンドポイントを呼び出している他のアプリケーションとこれらのIPアドレスを共有しているが、レート制限を超過すると、エンドポイントはを超えた制限のエラーでエラーが発生し、UrlFetchが失敗します。
Here Twitterの検索APIを使用した別のケース。

Google App EngineとサードパーティのWeb APIを混在させる場合、APIが認証された呼び出しを提供していることを確認して、アプリケーションが独自の割り当て(たとえばStackApps API)を持つことができるようにする必要があります。

+1

非常に良い答え! – Alfred

+0

私はプロキシサーバーとしてappengineのgAppProxyを使用していますが、appengineの発信IPは10分で3回変更されているため、一部のWebサイトでは、 – diyism

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