미니터 : 미니 트위터

 

기능

- 회원가입

- 로그인

- 트윗

- 다른 회원 팔로우

- 다른 회원 언팔로우

- 타임라인

 

1. 회원가입

필요한 정보

- id

- name

- email

- password

- profile

 

from flask import Flask, jsonify, request

app = Flask(__name__)
app.users = {}
app.id_count = 1

@app.route("/sign-up", method=['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)

 

상세설명

from flask import Flask, jsonify, request
# request : HTTP 요청을 통해 JSON 데이터 읽기 가능
# jsonfiy : dictionary 객체를 JSON으로 변환하여 HTTP 응답으로 보내기


app = Flask(__name__)
app.users = {}
# 새로 가입한 사용자를 dict으로 users에 정의
# key는 사용자 id, value는 사용자 정보
app.id_count = 1
# 회원가입시 id는 하나씩 증가

@app.route("/sign-up", method=['POST'])
# 엔드포인트 지정, POST method 사용
def sign_up():
    new_user = request.json # HTTP 요청을 통해 전송된 JSON 데이터를 파이썬 dict으로 변환
    new_user["id"] = app.id_count # HTTP 요청으로 전송된 회원가입 정보에 id 값을 더함
    app.users[app.id_count] = new_user # 회원가입 정보를 dict에 저장
    app.id_count = app.id_count + 1

    return jsonify(new_user) # dict을 JSON으로 변환, default는 200

 

더보기

id를 증가하는 방식은 동시다발적으로 일어나는 경우 잘못 지정될 가능성이 존재

해결을 위해 atomic increment operation 여러 스레드가 동시에 값을 증가시킬 수 있도록 해결


from flask import Flask, jsonify, request

app = Flask(__name__)
app.users = {}
app.id_count = 1

@app.route("/ping", methods=['GET'])
def ping():
    return "pong"

@app.route("/sign-up", method=['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)

 

실행 - miniter.py로 저장함

$ ~/Desktop/Projects/api
$ FLASK_ENV=development FLASK_APP=miniter.py flask run
 * Environment: development
 * Debug mode: on
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 142-243-606
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

 

FLASK_ENV 는 개발 스테이지를 뜻함

development 는 debug mode로 실행됨

-> 코드가 수정될 때마다 자동으로 재시작 해줌

 

$ http -v POST localhost:5000/sign-up name=현욱 email=lego7407@naver.com password=test123
POST /sign-up HTTP/1.1
Accept: application/json, */*;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Length: 78
Content-Type: application/json
Host: localhost:5000
User-Agent: HTTPie/2.4.0

{
    "email": "lego7407@naver.com",
    "name": "현욱",
    "password": "test123"
}


HTTP/1.0 200 OK
Content-Length: 101
Content-Type: application/json
Date: Mon, 15 Feb 2021 13:37:27 GMT
Server: Werkzeug/1.0.1 Python/3.8.5

{
    "email": "lego7407@naver.com",
    "id": 1,
    "name": "현욱",
    "password": "test123"
}

 

HTTP/1.0 200 OK 면 엔드포인트가 정상적으로 작동하는 것

 

2. 제한 트윗

- 사용자는 300자를 초과하지 않는 글을 올림

- 300자 초과시 엔드포인트는 400 Bad Request 응답을 보냄

- 300자 이내 글이라면 저장

{
	"id" : 1
    "tweet" : "My first post"
 }

 

app.tweets = []

@app.route("/tweet", method=['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.tweets = [] # 사용자들의 트윗을 저장할 디렉터리

@app.route("/tweet", method=['POST'])
def tweet():
    payload = request.json
    user_id = int(payload(['id'])
    tweet = payload['tweet'] # tweet 필드를 읽어 300자 확인

    if user_id not in app.users:
        return '사용자가 존재하지 않습니다', 400

    if len(tweet) > 300 :
        return '300자를 초과했습니다', 400

    user_id = int(payload['id']) # 사용자 id 읽음
    app.tweets.append({ # app.tweet 리스트에 저장
        'user_id':user_id,
        'tweet':tweet
    })

    return '',200

 

전문

import os
from flask import Flask, jsonify, request 

app = Flask(__name__)
app.users = {}
app.id_count = 1
app.tweets = []


@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

 

실행

http -v POST localhost:5000/sign-up id=1 tweet="My First Tweet"

 

결과

$ http -v POST localhost:5000/tweet id=1 tweet="My First Tweet"
POST /tweet HTTP/1.1
Accept: application/json, */*;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Length: 38
Content-Type: application/json
Host: localhost:5000
User-Agent: HTTPie/2.4.0

{
    "id": "1",
    "tweet": "My First Tweet"
}


HTTP/1.0 200 OK
Content-Length: 0
Content-Type: text/html; charset=utf-8
Date: Mon, 15 Feb 2021 13:49:28 GMT
Server: Werkzeug/1.0.1 Python/3.8.5

 

200 OK 면 정상적으로 구현된 것

만약 400 이라면 사용자 생성이 안된 것 이기 때문에 회원가입 엔드포인트로 생성한 후 재시도 할 것

 

아직 데이터베이스에 담은 것이 아니고 메모리에 저장하는 것이므로 서버가 재실행되면 지워짐

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기