캠프 9주 2일차 TIL
오늘
오픈 api를 받아서 django에서 json형식으로 출력하는 걸 알아봤다. 일단 method는 get이었고 처음 배울 땐 함수로 호출하는 방식이었는데 이젠 class를 배웠기에 class로 작성을 했다. api는 처음엔 영화진흥위원회에서 받아왔는데 필요한 부분(내용, 영화포스터)이 없어서 다른 데를 찾다가 TMDB에서 찾았다. 포스터가 있는 것도 그렇고 줄거리도 자세히 쓰여있었다. 우선 내가 작성한 순서를 보면 시작은 전체를 호출해 왔다.
class MovieApi(APIView):
def get(self, request):
url = "https://api.themoviedb.org/3/movie/now_playing?language=ko-KR&page=1®ion=KR"
headers = {
"accept": "application/json",
"Authorization": "Authorization: Bearer 발급받은키값"
response = requests.get(url, headers=headers)
data = response.json()
return JsonResponse(data,safe=False)
이렇게 하면 불필요한 부분이 많다. 그래서 필요한 부분만 출력해주고 싶어서 이것저것 찾아보다가 for문으로 필요한 부분만 append해주는 걸 발견했다 사실 알고 있었을 텐데 바로 딱 떠오르지 않았다 ㅠㅠ 그래서 수정한 것은
class MovieApi(APIView):
def get(self, request):
# today = datetime.date.today() - datetime.timedelta(days=2)
# target_day = today.strftime('%Y%m%d')
url = "https://api.themoviedb.org/3/movie/now_playing?language=ko-KR&page=1®ion=KR"
headers = {
"accept": "application/json",
"Authorization": "Authorization: Bearer 발급받은키값"
}
response = requests.get(url, headers=headers)
data = response.json()
results = []
for movie in data["results"][:10]:
results.append({
"id": movie["id"],
"title": movie["title"],
"genre_ids": movie["genre_ids"],
"original_title": movie["original_title"],
"overview": movie["overview"],
"poster_path": movie["poster_path"],
"release_date": movie["release_date"],
"vote_average": movie["vote_average"],
})
return JsonResponse(results,safe=False)
이렇게 이고 for문만 보면
results = []
for movie in data["results"][:10]:
results.append({
"id": movie["id"],
"title": movie["title"],
"genre_ids": movie["genre_ids"],
"original_title": movie["original_title"],
"overview": movie["overview"],
"poster_path": movie["poster_path"],
"release_date": movie["release_date"],
"vote_average": movie["vote_average"],
})
return JsonResponse(results,safe=False)
json data를 보면 dates, results로 나눠져 있고 그중에서 results부분에 위에 입력된 값들을 받아오고 싶었다. 딕셔너리형태로 각각의 key, value로 해당데이터들을 호출해 준다.
각호 출 받은 데이터를 result에 붙여주면서 출력했다.
JsonResponse는 기본적으로 JSON 배열로 시리얼라이즈를 한다.
safe디폴트값이 True이기에 object는 False를 해줘야 오류가 나지 않는다.
result는 JSON배열이므로 False를 해줘 야한다.
JSON객체일 경우에는 True가 맞고 디폴트값이기 때문에 따로 작성하지 않는다.
제외한값 중에는 투표수, 인기도, 심의등급, 제작언어 등등 이번프로젝트에 필요 없는 부분들이 있어서 제거해 주기 위해서 필요한 부분만 빼왔다. 사실 4개밖에 안 돼서 4개를 빼고 출력해 보려고 알아봤는데 그 부분은 찾지 못해서 데이터입력으로 추렸다. 그리고 이건 detail페이지 데이터고 main페이에서는 더 간소화해서 출력한다.
results = []
for movie in data["results"][:10]:
results.append({
# "id": movie["id"], # 필요하면추가
"title": movie["title"],
"original_title": movie["original_title"],
"poster_path": movie["poster_path"],
})
return JsonResponse(results,safe=False)
이렇게 출력하기 때문에 제외하는 거보단 선택적으로 가져오는 게 더 유용하다고 판단했다(물론 방법을 못 찾았지만...?)
오늘은 django에서 json형식으로 api를 받는 법을 알아봤다. 처음엔 재밌다가 점점 어렵고 영화진흥원 api는 커스텀하는 부분이 있었는데 tmdb는 커스텀의 맛이 없었다.
오늘의 규파팡이 느낀 점!
어제와 유사하지만 모르는 걸 작업할 때 처음엔 막막하다가도 일단 시작하자! 하면 술술 풀려나가는 맛이 있다. 코딩은 이런 맛인 거 같다 애초에 개발자 더 유용하게 만드는 사람이니깐 내손으로 누군가에게 유익을 준다는 건 생각보다 더 축복받은 직업 같다. 열심히 하다 보면 오늘의 이 til도우스워지는 날이 오겠지?