⚡️ API 개발 with Flask - 5

codeamor·2020년 7월 6일
0

API Development

목록 보기
5/9

✔️ 타임라인 엔드포인트

: 트위터의 타임라인처럼 해당 사용자의 트윗들 그리고 팔로우하는 사용자들의 트윗들을 리턴해 주는 엔드포인트이다.

  • 데이터의 수정이 없이 받아 오기만 하는 엔드포인트이므로 HTTP 메소드는 GET이 된다.

타임라인 엔드포인트가 리턴하는 JSON 데이터는 다음과 같은 형태의 데이터를 리턴한다.

{
    "user_id"  : 1,
    "timeline" : [
        {
            "user_id" : 2,
            "tweet"   : "Hello, World!"
        },
        {
            "user_id" : 1,
            "tweet"   : "My first tweet!",
        }
    ],
}
  1. "user_id" : 1
    : 해당 사용자의 아이디

  2. "timeline" : []
    : 해당 사용자의 사용자가 팔로우하는 사용자들의 트윗 리스트

  3. "user_id" : 2
    : 해당 트윗을 올린 사용자 아이디

  4. "tweet" : "Hello, World!"
    : 트윗 내용

이제 타임라인 엔드포인트를 구현한다.

  • 트윗 엔드포인트에서 사용자들의 트윗을 app.tweets 리스트에 저장했다.
    사용자의 타임라인을 전송하기 위해서 app.tweets 리스트에서 해당 사용자, 그리고 사용자가 팔로우하는 사용자들의 트윗들을 찾은 후에 전송하면 된다.
@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
    })

  1. @app.route('/timeline/<int:user_id>', methods=['GET'])
    : 엔드포인트의 주소에서 <int:user_id> 부분은 해당 사용자의 아이디를 지정할 수 있게 해준다.
    예를 들어, "/timeline/1" 이 경우 타임라인 엔드포인트에 user_id 인자에 int 값으로 1이 지정되어 엔드포인트를 구현한 함수인 2번에 전달된다.

  1. def timeline(user_id):
    : 타임라인 엔드포인트를 구현하는 함수에 user_id를 인자로 받는다.
  • 1번에서 지정된 엔드포인트 주소를 통해 받는 값이며 해당 사용자의 아이디이다.

  1. follow_list = app.users[user_id].get('follow', set())
    : 해당 사용자가 팔로우 하는 사용자들 리스트를 읽어 들인다.
  • 만약 사용자가 다른 사용자를 팔로우한 적이 없는 경우 follow 필드가 존재하지 않을 수도 있다. 이 경우에는 empty set을 리턴한다.

  1. follow_list.add(user_id)
    : 팔로우하는 사용자 리스트에 해당 사용자의 아이디도 추가한다.
    이로써 팔로우하는 사용자들의 트윗뿐만 아니라 해당 사용자의 트윗도 볼 수 있다.

  1. timeline = [tweet for tweet in app.tweets if tweet['user_id'] in follow_list]
    : 전체 트윗 중 해당 사용자, 그리고 해당 사용자가 팔로우하는 사용자들의 트윗들만 읽어 들인다.

  1. return jsonify({ 'user_id' : user_id, 'timeline' : timeline })
    : 사용자 아이디와 함께 타임라인을 JSON 형태로 리턴한다.

(1부터 6까지 썼는데 벨로그 오류로 순서가 전부 1로 나오네요..
벨로퍼트 선생님 고쳐주세요..)

이제 API를 실행시킨 후 타임라인 엔드포인트를 호출한다.

타임라인 엔드포인트를 호출하기 전에 사용자들을 생성해야 하고,
각 사용자마다 트윗을 생성하고, 사용자 팔로우를 해놓아야 한다.
아래와 같은 결과가 나오면 성공이다.




✔️ 미니터 구현 정리


  • 데이터를 수정하는 기능의 엔드포인트는 POST를 사용한다.
  • 데이터를 읽어 들이는 기능의 엔드포인트는 GET을 사용한다.
  • POST 엔드포인트에 데이터를 전송할 때는 body에 JSON 형식으로 데이터를 전송한다.
  • URL에 인자를 전송하고 싶을 때는 <type:value> 형식으로 URL을 구성한다.
    예를 들어, int 값의 사용자 아이디를 URL에 포함시켜 받고 싶을 때는 다음과 같이 주소를 구성한다.
    /timeline/<int:user_id>
  • 중복된 값이 없어야 하는 데이터라면 set을 사용하고 순서나 순차가 중요하다면 list를 사용하자.
    키와 값을 표현하는 데이터의 경우는 dictionary를 사용한다.


Reference

0개의 댓글