이전 블로그를 통해서 회원가입, 트윗 올리기, 서로 다른 사용자 팔로우/언팔로우하기 까지 구현하였다.
이제는 지금까지 사용자의 타임라인을 볼 수 있는 엔드포인트를 구현하고자 한다.
{
"user_id" : 1,
"timeline" : [
{
"user_id" : 2,
"twitter" : "Hello World!"
},
{
"user_id" : 1,
"twitter" : "My first twitter!"
}
]
}
@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형태로 리턴한다.
(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
}
데이터를 수정하는 기능의 엔드포인트는 POST 메소드를 사용한다
데이터를 읽어 들이는 기능의 엔드포인트는 GET 메소드를 사용한다
POST 엔드포인트에 데이터를 전송할 때는 body에 JSON 형식으로 데이터를 전송한다
URL에 인자(parameter)를 전송하고 싶을 때는 <type:value>
형식으로 URL을 구성한다.
(ex. int 값의 사용자 id를 URL에 포함시켜 보내고자할때에는 다음과 같이 주소를 구성한다 : /timeline/<int:'user_id'>
)
중복된 값이 없어야 하는 데이터라면 set
을 사용하고 순서나 순차가 중요하다면 list
를 사용한다.
Key:value 로 구성된 데이터라면 dictionary
를 사용한다.