취직 준비를 할 동안 프로젝트 코딩을 하나도 안하고 있자니 좀 지루해지는것 같아서 Flask를 공부해보기로 했다. 이유는 Django 와 더불어 Python 프레임 워크의 양대 산맥이기 때문이다.
모든 구글 API가 그러하듯 API를 사용하려면 API_KEY를 발급받거나, OAUTH를 통한 AccessToken을 발급받아야 한다.
댓글을 읽어오는 기능은 API_KEY만 사용해도 가능하기에 API키를 구글 API콘솔에서 발급받는다.
(개발하며 몇번 호출하는것은 그다지 과금이 되지 않을 것으로 보이나 과금은 항상 주의하자..)
httpie로 테스트 하는 방법도 있고, 유튜브 콘솔창에서 테스트 하는 방법도 있겠으나, 어차피 get메소드를 호출할것이기도하고, 크롬의 Json을 정리해주는 익스텐션을 깔아놓았기에 주소창에 바로 다음 요청을 보냈다.
https://www.googleapis.com/youtube/v3/commentThreads?key={당신의 키}&textFormat=plainText&part=snippet&videoId={당신의 비디오 아이디}
읽어온 호출의 결과는 다음과 같다.
이제 플라스크를 통해 비디오 아이디를 입력하면 그 댓글 아이템들을 읽어오는 코드를 짜보자
플라스크의 특이하면서도, 편하다면 편하고, 불편하다면 불편할 수 있는점은, 딱 API를 만드는데 필요한 기능만을 제공한다는 것이다.
우선 프로젝트를 만들 폴더에, app.py
라는 파일을 만들어준다.
필자가 짠 코드는 다음과 같다.
http요청의 body에 video_id라는 키로 값을 보내주면, 그 키에 따라 구글유튜브 API에 요청을 보내 댓글들을 읽어서 응답으로 내보낸다.
#app.py
import requests
from flask import Flask, request, jsonify
from my_settings import google_api_key
api요청을 보내기 위해 requests를 설치하여 임포트해주고, 플라스크에서 request와 jsonify를 임포트해준다.
request는 받은 http 리퀘스트이고, jsonify는 후에 우리가 내보낼 응답을 json화 해줄 메소드이다.
app = Flask(__name__)
@app.route("/comments", methods = ["POST"])
플라스크를 보고 어이가 없기도하고, 황당했던 점이기도 하다.
Flask클래스의 이름을 가진 메서드를 app으로 지정한 후, route메서드를 통해 URI와 메소드를 지정해주어, REST API로 만들어주었다.
@app.route("/comments", methods = ["POST"])
def comments():
data = request.json
video_id = data["video_id"]
request_url = f"""https://www.googleapis.com/youtube/v3/commentThreads?key={google_api_key}&textFormat=plainText&part=snippet&videoId={video_id}&maxResults=10"""
comments_data = requests.get(request_url)
jsonized_data = comments_data.json()
result = []
comments_list = {
"items" : jsonized_data["items"]
}
return jsonify(comments_list), 200
이후는 Django로 views.py를 짤 때와 똑같다.
HTTP request를 변수로 지정해 받아주고, 필요한 정보를 빼내어 Youtube API로 리퀘스트를 보낸다.
이후 반환된 응답에서 내가 필요한 부분인 "items"만 빼내어 Http Response로 반환해 주는 것이다.
물론 Django에서도 똑같은 기능을 구현하는건 그리 어렵지 않다. 다만 앱이라는 단위로 기능을 나누고 폴더도 나뉘는 Django에 비하여, Flask는 원하는 기능을 구현하고 개발할 때 파일 하나로도 구현이 가능하기에 뭔가 원하는 아키텍쳐 스타일이 명확하다면 Flask가 더 프로그램을 짜기에 적합하지않을까라는 느낌이 들었다.
댓글 작성도 가능한가요?