APIのレート制限を守る
これまで学んだエラーハンドリングを実践してみましょう。この演習では、短時間にサーバーへ過剰なリクエストを送ってしまうことで発生する「レート制限エラー」に遭遇します。スクリプトが失敗しないよう、レート制限を回避する対策を実装して修正しましょう。
あなたの音楽ライブラリには3,500曲以上が含まれています。各トラックの Length プロパティを確認して、最も長いトラックを探してみます。
ただし問題があります。/tracks API は1ページあたり最大500件まで、かつ1秒あたり1リクエストというレート制限があります。現在のスクリプトは短時間にリクエストを送りすぎています。これを修正しましょう!
requests と time パッケージはすでにインポート済みで、次の変数を用意しています。
longestTrackLength = 0
longestTrackTitle = ""
headers = {'Authorization': 'Bearer 8apDFHaNJMxy8Kt818aa6b4a0ed0514b5d3'}
page_number = 1
この演習はコースの一部です
Python で学ぶ API 入門
演習の手順
- まずはコードを変更せずに実行してみてください。コンソールに
429 Client Errorが表示され、短時間に過剰なリクエストを送っていることがわかります。 timeパッケージのsleepメソッドを使い、while ループの最後に「3秒の待機」を追加してスクリプトを修正してください。
実践的なインタラクティブ演習
このサンプルコードを完成させて、この演習に挑戦してみましょう。
while True:
params = {'page': page_number, 'per_page': 500}
response = requests.get('http://localhost:3000/tracks', params=params, headers=headers)
response.raise_for_status()
response_data = response.json()
print(f'Fetching tracks page {page_number}')
if len(response_data['results']) == 0:
break
for track in response_data['results']:
if(track['Length'] > longestTrackLength):
longestTrackLength = track['Length']
longestTrackTitle = track['Name']
page_number = page_number + 1
# Add your fix here
____.____(3)
print('The longest track in my music library is: ' + longestTrackTitle)