이번에 구현할 기능은 타임라인 기능이다. 타임라인은 팔로우한 사용자의 글 목록을 보여주는 기능이다.
코드는 다음과 같다.
@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})
타임라인 기능 구현이 미니터의 마지막 기능이다. 지금껏 구현한 코드는 다음과 같다.
from flask import Flask, jsonify, request
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 = Flask(__name__)
app.id_count = 1
app.users = {}
app.tweets = []
app.json_encoder = CustomJSONEncoder
@app.route("/ping", methods=['GET'])
def ping():
return "pong"
@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.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
@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)
@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})
이제 타임라인 기능이 제대로 작동하는지 확인하기 위해 사용자, 트윗, 팔로우를 생성해 보고 타임라인이 제대로 작동하는지 확인해 보자
● 사용자 생성
● 트윗 생성
● 팔로우 하기
● 타임라인 확인
문제 없이 잘 실행된다!
'Backend > Flask 개발일지' 카테고리의 다른 글
11. SQLAlchemy 라이브러리 설치와 config.py(연결정보 저장 파일) (0) | 2022.01.17 |
---|---|
9. 미니터(Miniter) API 개발 엔드포인트와 HTTP 요청 총 정리 (0) | 2022.01.11 |
6. 미니터(Miniter) API 개발 (300자 제한 트윗 글 올리기) (0) | 2022.01.05 |
5. 미니터(Miniter) API 개발 (회원가입) (0) | 2022.01.03 |
3. 미니콘다 가상 환경 설치와 Flask 설치, ping 엔드 포인트 (0) | 2021.12.31 |