2011-01-27 3 views
5

내 응용 프로그램에서 urlfetch를 사용하고 있으며 모든 것이 개발 환경에서 완벽하게 작동하지만 urlfetch가 실제로 배포 될 때 매우 신뢰할 수 없다는 것을 알게되었습니다. 때로는 (데이터 검색) 그래야 작동하지만 몇 분 후에 아무 것도 반환하지 않을 수도 있습니다. 그런 다음 몇 분 후에 다시 정상적으로 작동합니다. 이것은 매우 용납 할 수없는 일입니다. 나는 그것이 문제가되는 소스 URL (YQL)이 아닌지 확인했으며, 개발 환경에서 모든 것이 제대로 작동하는지 확인했다.App Engine : urlfetch의 대안은 무엇입니까? 매우 신뢰할 수없는 것 같습니다.

시도해 볼 수있는 제 3 자 라이브러리가 있습니까?

예제 코드 : 때때로

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을 cehck하고 싶을 수도 있습니다.

하나의 가능성은 귀하의 요청이 생산 시스템에서는 야후에 의해 거부되거나 등급이 매겨지고 있지만 개발 시스템에서는 거부 된 것일 수 있습니다.

+0

흠, 그것은 json을 반환하지만 데이터가 없습니다. YQL의 요율 제한을 확인했는데 시간당 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.

구글 앱 엔진은 IP 풀 나가는 URL을 가져올 요청을 해결하고 응용 프로그램이 같은 야후의 엔드 포인트를 호출하는 다른 응용 프로그램이 IP 주소를 공유합니다; 속도 제한을 초과하면 끝 점이을 초과하는 한계 인 으로 응답하여 UrlFetch가 실패하게됩니다.
Here Twitter 검색 API를 사용하는 또 다른 사례입니다.

Google App Engine 및 제 3 자 웹 API를 혼합 할 때 API가 응용 프로그램이 자체 할당량 (예 : StackApps API)을 가질 수 있도록 인증 된 호출을 제공해야합니다.

+1

아주 좋은 답변입니다! – Alfred

+0

프록시 서버로 appengine에서 gAppProxy를 사용하고 있지만, appengine 나가는 IP는 10 분에 3 번 변경되어 일부 웹 사이트에서 내 세션을 종료합니다. – diyism

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