app.py
import os
from flask import Flask, jsonify, request
from flask.json import JSONEncoder
class CustomJSONEncoder(JSONEncoder): # 1
def default(self, obj):
if isinstance(obj, set):
return list(obj)
return JSONEncoder.default(self, obj)
app = Flask(__name__)
app.users = {}
app.id_count = 1
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 += 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
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"]) # 4
def unfollow():
payload = request.json
user_id = int(payload["id"])
user_id_to_unfollow = int(payload["unfollow"])
if user_id not in app.users or user_id_to_unfollow not in app.users:
return "사용자가 존재하지 않습니다", 400
user = app.users[user_id]
if not user.get("follow") or len(user.get("follow")) == 0:
return "팔로우하고 있는 사용자가 없습니다", 400
user.setdefault("follow", set()).discard(user_id_to_unfollow)
return jsonify(user)
@app.route("/timeline/<int:user_id>", methods=["GET"]) # 1
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})
if __name__ == "__main__":
os.system("./run_server.sh")
run_server.sh
#!/usr/bin/env bash
# 가상환경을 activate
source activate api
# flask 웹 어플리케이션은 development 모드로 run
export FLASK_ENV=development # flask가 실행되는 개발 스테이지, development로 정해놓으면 debug mode 실행
export FLASK_app=app.py
flask run
실행
1. sh run_server.sh
2. ping 입력
반응형
'SW ENGINEERING > Flask' 카테고리의 다른 글
API 개발하기(10) - MySQL 설치 (0) | 2021.02.17 |
---|---|
API 개발하기(9) - 데이터베이스 개념 (0) | 2021.02.17 |
API 개발하기(7) - 미니터(Miniter) 개발하기(3) (0) | 2021.02.16 |
API 개발하기(6) - 미니터(Miniter) 개발하기(2) (0) | 2021.02.15 |
API 개발하기(5) - 미니터(Miniter) 개발하기(1) (0) | 2021.02.15 |
최근댓글