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