app.users = {}
app.id_count = 1
@app.route("/sign-up", methods=['post'])
def sign_up():
new_user = request.json
new_user["id"] = app.id_count
app.users[app.id_count] = new_user
app.id_count = app.id_count + 1
return jsonify(new_user)
회원가입의 필요한 사용자의 이름, 이메일, 아이디, 비밀번호, 프로필 등을 구현했다.
app.tweets = []
@app.route("/tweet", methods=['POST'])
def tweet():
payload = request.json
user_id = int(payload['id'])
tweet = payload['tweet']
if user_id not in app.users:
return '사용자가 존재하지 않습니다.', 400
if len(tweet) > 300:
return '300자를 초과 했습니다.', 400
user_id = int(payload['id'])
app.tweets.append({
'user_id' : user_id,
'tweet' : tweet
})
return '', 200
이하 밑에 API 설명은 생략하겠다. 소스코드 보고 직접 생각해보고 실습해보자.
@app.route('/follow', methods=['POST'])
def follow():
payload = request.json
user_id = int(payload['id'])
user_id_to_follow = int(payload['follow'])
if user_id not in app.users or user_id_to_follow not in app.users:
return '사용자가 존재하지 않습니다.', 400
user = app.users[user_id]
user.setdefault('follow', set()).add(user_id_to_follow)
return jsonify(user)
위와 같이 실행하면, 사용자 아이디들을 저장하는 자료구조로 set을 json 모듈이 JSON으로 변경 할 수 없어 오류가 날 것이다. (list는 가능하다.)
그래서 커스텀 JSON 엔코더(custom JSON encoder)를 만들어서 디폴트 JSON 엔코더(default JSON encoder)에 덮어 씌울 것이다.
from flask.json import JSONEncoder
class CustomJsonEncoder(JSONEncoder):
def default(self, obj):
if isinstance(obj, set):
return list(obj)
return JSONEncoder.default(self, obj)
app.json_encoder = CustomJsonEncoder
if isinstance(obj, set):
return list(obj)
*만약 객체(obj)가 set인 경우 list로 변경해서 리턴@app.route('/unfollow', methods=['POST'])
def unfollow():
payload = request.json
user_id = int(payload['id'])
user_id_to_follow = int(payload['unfollow'])
if user_id not in app.users or user_id_to_follow not in app.users:
return '사용자가 존재하지 않습니다.', 400
user = app.users[user_id]
user.setdefault('follow', set()).discard(user_id_to_follow)
return jsonify(user)
@app.route('/timeline/<int:user_id>', methods=['GET'])
def timeline(user_id):
if user_id not in app.users:
return '사용자가 존재하지 않습니다.', 400
follow_list = app.users[user_id].get('follow', set())
follow_list.add(user_id)
timeline = [tweet for tweet in app.tweets if tweet['user_id']in follow_list]
return jsonify({
'user_id' : user_id,
'timeline' : timeline
})
Flask와 파이썬 문법들을 사용해 좀 그럴듯한 미니터 API들을 구현해봤습니다.