Flask - Minitter 만들기(3)

황인용·2020년 1월 31일
0

Flask

목록 보기
5/13

Timeline 기능

이전 블로그를 통해서 회원가입, 트윗 올리기, 서로 다른 사용자 팔로우/언팔로우하기 까지 구현하였다.
이제는 지금까지 사용자의 타임라인을 볼 수 있는 엔드포인트를 구현하고자 한다.

Timeline API 설계

  • Timeline API 주소 : /timeline<int:user_id>
  • Timeline 엔드포인트 method : GET
  • Timeline 엔드포인트 호출할 때 리턴하는 JSON 데이터형식
{
	"user_id"	: 1,
    "timeline"	: [
    	{
        	"user_id" : 2,
            "twitter" : "Hello World!"
         },
         {
         	"user_id" : 1,
            "twitter" : "My first twitter!"
          }
     ]
}

Timeline API 구현

@app.route('/timeline/<int:user_id>', methods=['GET'])	# 1)
def timeline(user_id):	# 2)
    if user_id not in app.users:
        return '유저가 존재 하지 않습니다', 400

    follow_list = app.users[user_id].get('follow', set())	# 3)
    follow_list.add(user_id)	# 4)
    timeline = [tweet for tweet in app.tweets if tweet['user_id'] in follow_list]	# 5)

    return jsonify({	# 6)
        'user_id'  : user_id,
        'timeline' : timeline
    })

1) 엔드포인트의 주소에서 <int:user_id>는 엔드포인트의 주소에 해당 사용자의 아이디를 지정할 수 있게 해준다.
(Ex. "/timeline/1" 일 경우 타임라인 엔드포인트에 user_id 인자에 int 값으로 1이 지정되어 엔드포인트를 구현한 함수인 2) 에 전달된다.

2) <int:user_id>에서 받은 user_id를 인자를 받는다.

3) 먼저 해당 사용자가 팔로우하는 사용자들 리스트를 읽어들여서 follow_list 에 넣는다.
만일 사용자가 팔로우한적 없을 경우 empty set을 리턴한다.

4) 팔로우하는 사용자 리스트에 해당하는 사용자의 id도 추가한다. 그러므로 팔로우하는 사용자들의 트윗뿐만 아니라 해당 사용자의 트윗도 볼 수 있도록 한다.

5) 전체 트윗 중에 해당 사용자 그리고 해당 사용자가 팔로우하는 사용자들의 트윗들만 읽어 들인다.

6) 사용자 id와 함께 타임라인들 JSON형태로 리턴한다.

Unfollow API 실행 및 테스트

(develop) $ http -v POST localhost:5000/twitter id=1 twitter="My first Tweet"
POST /tweet HTTP/1.1
Accept: application/json, */*
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Length: 38
Content-Type: application/json
Host: localhost:5000
User-Agent: HTTPie/0.9.8

{
    "id": "1",
    "twitter": "My first Tweet"
}

HTTP/1.0 200 OK
Content-Length: 0
Content-Type: text/html; charset=utf-8
Date: Fri, 31 Jan 2020 02:45:06 GMT
Server: Werkzeug/0.16.1 Python/3.7.6

# timeline 
(develop) $ http -v GET localhost:5000/timeline/1GET /timeline/1 HTTP/1.1
Accept: */*
Accept-Encoding: gzip, deflate
Connection: keep-alive
Host: localhost:5000
User-Agent: HTTPie/0.9.8



HTTP/1.0 200 OK
Content-Length: 106
Content-Type: application/json
Date: Fri, 31 Jan 2020 02:45:10 GMT
Server: Werkzeug/0.16.1 Python/3.7.6

{
    "timeline": [
        {
            "twitter": "My first Tweet",
            "user_id": 1
        }
    ],
    "user_id": 1
}

Minitter 정리

  • 데이터를 수정하는 기능의 엔드포인트는 POST 메소드를 사용한다

  • 데이터를 읽어 들이는 기능의 엔드포인트는 GET 메소드를 사용한다

  • POST 엔드포인트에 데이터를 전송할 때는 body에 JSON 형식으로 데이터를 전송한다

  • URL에 인자(parameter)를 전송하고 싶을 때는 <type:value> 형식으로 URL을 구성한다.
    (ex. int 값의 사용자 id를 URL에 포함시켜 보내고자할때에는 다음과 같이 주소를 구성한다 : /timeline/<int:'user_id'>)

  • 중복된 값이 없어야 하는 데이터라면 set을 사용하고 순서나 순차가 중요하다면 list를 사용한다.

  • Key:value 로 구성된 데이터라면 dictionary를 사용한다.

profile
dev_pang의 pang.log

0개의 댓글