Flask사용하면서 느낀점 정리 #1
내가 Flask 를 최근에 많이 가지고 논 이유는 다음과 같다.
- 코드 많이 쓰기 귀찮아서
- 간만에 Node로 때우자니 이전에 사용했던 경험 되살리기 귀찮아서
- Xcode랑 AppCode빼고 남아있는게 PyCharm 밖에 없고 vscode사용하자니 내 입맛대로 셋팅하자니 귀찮아서
그냥 귀찮아서…
용불용설이라고… 했던거 한동안 안하면 까먹거나 가물가물한다.
요즘엔 AWS가 핫하지 않습니꽈, 특히 lambda (회사 생활하면서 주로 간접적으로 체감했던거라)
그리고 dynamoDB, 솔직히 이번 포스팅하면서 첨 접하는거라 약간의 룰정도만 익히고 PynamoDB를 씁니다.
pynamodb/PynamoDB
_A pythonic interface to Amazon’s DynamoDB. Contribute to pynamodb/PynamoDB development by creating an account on…_github.com
참 잘만든 라이브러리인거 같습니다. 언능 star 1,000 달성하길 기원합니다.
우선 Model 대충 맹글어봅시다.
from pynamodb.models import Model
from pynamodb.attributes import (
NumberAttribute,
UnicodeAttribute
)
class User(Model):
class Meta:
table\_name = 'User'
read\_capacity\_units = 1
write\_capacity\_units = 1
host = "http://localhost:8000"
id = NumberAttribute(hash\_key=True)
username = UnicodeAttribute()
bio = UnicodeAttribute()
역시 귀찮아서 저는 Local DB를 사용하겠습니다. Table이름과 read_capacity, write_capacity를 Meta에 define해주고 제가 사용하고자 하는 property 들을 작성해줍니다. (id/username/bio)
대충 user.json 만들어서 seed 때려줍니다. 그리고 user API가 있는 user_service blue print는 app객체에 register_blueprint해줍니다.
from flask import Flask
from user_service import user_service
import db
app = Flask(__name__)
db.seed() <– 여기
app.register_blueprint(user_service)
if __name__ == “__main__”:
app.run()
bluePrint쓰는건 체계적으로 설계하기 위함입니다. 한 페이지에 API 로직 다 때려박는건 저도 원치않습니다. 아무리 귀찮아도 blueprint를 써야겠습니다.
user_service.py 에 대충 GET user/{id} 만 대충맹글어봅니다.
from flask import Blueprint, make_response, jsonify, request
from models.user import User
user_service = Blueprint(“users”, __name__, url_prefix="/users")
@user_service.route("/int:id", methods=[“GET”])
def get_user(id: int):
user: User
try:
user = User.get(id)
except User.DoesNotExist:
return make\_response("Not Found", 404)
res\_obj = {
"data": {
"username": user.username,
"bio": user.bio
}
}
return make\_response(jsonify(res\_obj), 200)
data object로 처리하는 이유는 나중에 after key를 추가해서 user list pagination 를 만들기 위해서입니다. (솔직히 Vingle 백엔드 개발자분들 이런거 뚝딱 만들어 내는거 보면 자랑스럽습니다.)
파잘개(파이썬 잘아는 개발자)님들에게는 제 코드가 마치 뭔가 냄새나는 코드같겠지만, “아 글쓴분 iOS 개발자지” 하고 대충 그려려니 이해해줍시다.
한번 대충 Postman으로 GET 때려봅시다.
사실 어제 술을 많이마셔서 만사가 귀찮은데도 여기까지 한 제 자신을 보고 박수라도 쳐주고 싶었습니다.
시작이 반 아니겠습니까.
대충 Pagination도 구현해봅시다.
@user_service.route("/list", methods=[“GET”])
def get_user_list():
API는 GET users/list 으로 정의하겠습니다.
그리고 DynamoDB Docs에서 대충 제눈에 들어오는게 last_evaluated_key 가 보이는군요 이걸 after key의 value로 넣으면 되지않을까 생각하고 대충 만들어서 API를 호출해봅니다.
뭔가 엉성하지만 제가 원하는 느낌으로 연출되는거 같습니다.
자세한건 https://github.com/pynamodb/PynamoDB/issues/248
상단 issue에 많은 PynamoDB 팬 분들이 자세히?토론을 해주셔서 저 또한 도움 잘받은거 같습니다.
숙취해소 되고나면 느낌점 #2로 돌아오겠습니다.
(주의: 맘 변심해서 안돌아 올수도 있음)
example source code:
https://gist.github.com/GeekTree0101/4005bfd63a1dab7f9a5f3039cf50075f