API-rate-limieten respecteren
Laten we in de praktijk brengen wat we over foutafhandeling hebben geleerd. In deze oefening krijg je een rate-limit-fout: je stuurt in korte tijd te veel requests naar de server. We lossen dit op door een workaround te implementeren die de rate limit omzeilt, zodat ons script niet faalt.
Je muziekbibliotheek bevat meer dan 3500 nummers, dus we gaan het langste nummer zoeken door de eigenschap Length van elk nummer te controleren.
Er is alleen een probleem: de /tracks API heeft een maximale paginagrootte van 500 items en een rate-limit van 1 request per seconde. Het script dat we hebben geschreven stuurt in korte tijd te veel requests naar de server. Laten we dit fixen!
De pakketten requests en time zijn al geïmporteerd en we hebben de volgende variabelen voor je aangemaakt:
longestTrackLength = 0
longestTrackTitle = ""
headers = {'Authorization': 'Bearer 8apDFHaNJMxy8Kt818aa6b4a0ed0514b5d3'}
page_number = 1
Deze oefening maakt deel uit van de cursus
Introductie tot API's in Python
Oefeninstructies
- Begin met het uitvoeren van de oefening zonder wijzigingen in de code. Je ziet in de console een
429 Client Error, wat aangeeft dat we in korte tijd te veel requests naar de server sturen. - Fix het script door aan het einde van de while-lus een pauze van 3 seconden toe te voegen met de methode
sleepuit het pakkettime.
Praktische interactieve oefening
Probeer deze oefening eens door deze voorbeeldcode in te vullen.
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)