( 참고 : “FastCampus, 데이터 엔지니어링 올인원” )
[ Data Engineering ]
Spotify Project - Error Handling
1. Error Handling
다양한 이유에서, 요청이 실패할 수 있다. (status code를 통해 해당 에러 원인 파악)
간단히 해결하고자 한다면, 단순히 try & except 구문으로 요청을 해보고 성공하면 그냥 그대로, 실패하면 에러가 뜨면 그 원인을 파악한 뒤 수정하면 된다.
try:
r = requests.get("https://api.spotify.com/v1/search", params=params, headers=headers)
except:
logging.error(r.text)
sys.exit(1)
하지만, 반환 받는 status code에 따라 우리는 해당 원인을 파악할 수 있고, 이를 코드로 구현하여 번거롭지 않게 보다 쉽게 자동화 할 수 있다.
status code가 200이 아니면 Error
- 429 : 너무 많은 request! ( Rate Limiting을 초과한 것이다)
- 해결 : Retry-After만큼의 초 만큼 대기를 해야 한다.
- 401 : access token 만료
- access token은 3600초 동안만 유효하다
- 해결 : 따라서, 해당 에러가 뜨면 토큰을 재발급 받으면 된다.
r = requests.get("https://api.spotify.com/v1/search", params=params,
headers=headers)
if r.status_code != 200:
logging.error(r.text)
if r.status_code == 429:
retry_after = json.loads(r.headers)['Retry-After']
time.sleep(int(retry_after))
r = requests.get("https://api.spotify.com/v1/search", params=params, headers=headers)
elif r.status_code == 401:
headers = get_headers(client_id, client_secret)
r = requests.get("https://api.spotify.com/v1/search", params=params, headers=headers)
else:
sys.exit(1)
2. Code Summary
step 1) get_headers
함수를 통해, access token을 담은 header를 가져온 뒤
step 2) 해당 header를 사용해서 정보를 request한다. ( + 에러 핸들링 )
def main():
headers = get_headers(client_id, client_secret)
params = {
"q": "BTS",
"type": "artist",
"limit": "5"
}
r = requests.get("https://api.spotify.com/v1/search", params=params, headers=headers)
if r.status_code != 200:
logging.error(r.text)
if r.status_code == 429:
retry_after = json.loads(r.headers)['Retry-After']
time.sleep(int(retry_after))
r = requests.get("https://api.spotify.com/v1/search", params=params, headers=headers)
elif r.status_code == 401:
headers = get_headers(client_id, client_secret)
r = requests.get("https://api.spotify.com/v1/search", params=params, headers=headers)
else:
sys.exit(1)