티스토리 뷰

Web programing/Flask

Flask 시작하기(2)

내일도이렇게 2019. 5. 4. 11:49

https://jmkim.tistory.com/18 이어서 나머지 기능들을 구현해 보겠습니다.

 

다른회원 팔로우 하기 

@app.route("/follow",method=['POST'])
def follow():
    payload = request.json
    user_id = int(payload['id'])    ## 1 
    user_id_to_follow = int(payload['follow']) ## 2

    if user_id not in app.users or user_id_to_follow not in app.users: ## 3
        return "사용자가 존재하지 않습니다",400

    user = app.users[user_id]    ## 4 
    user.setdefalut('follow',set()).add(user_id_to_follow) ## 5  

    return jsonify(user)

 

1. HTTP 요청으로 전송된 JSON 데이터에서 해당 사용자의 아이디를 읽어 들인다.

2. HTTP 요청으로 전송된 JSON 데이터에서 해당 사용자가 팔로우할 사용자의 아이디를 읽어 들인다.

3. 만일 해당 사용자나 팔로우할 사용자가 존재하지 않으면 400 응답을 보낸다.

4.  app.users 딕션너리에서 해당 사용자 아이디를 사용해서 해당 사용자의 데이터를 읽어 들인다. 

5. 4에서 읽어 들인 사용자의 정보를 담고 있는 딕셔너리가 'follow' 필드를 가지고 있다면 사용자 아이디를 추가하고 

없으면 empty set을 추가한다. 

 

set를 파이썬의 json 모듈이 json 으로 변경하지 못하기 때문에 커스텀 json 엔코더로 set를 list 로 변경해준다. 

 

from flask.json import JSONEncoder


class CustomJSONEncoder(JSONEncoder):
    def default(self,obj):
        if isinstance(obj,set):
            return list(obj)
        return JSONEncoder.default(self,obj)

app.json_encoder = CustomJSONEncoder

 

다른회원 언팔로우 하기 

@app.route('/unfollow',methods=['POST'])
def unfollow():
    payload = request.json
    user_id = int(payload['id'])
    user_id_to_follow = int(payload['unfollow'])

    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()).discard(user_id_to_follow)   ## 1 

    return jsonify(user)

 

1.  discard 를 사용하여 삭제하고자 하는 값이 있으면 삭제하고 없으면 무시하여 remove 대신 사용 

 

 

 

타임라인

 

@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> 엔드포인트의 주소에 해당 사용자의 아이디를 지정할 수 있게 해준다. 예를 들어,"/timeline/1" 경우

타임라인 엔드포인트에 user_id 인자에 int 값으로 1이 지정된다.

2. user_id 를 인자로 받는다.

3. 해당 사용자가 팔로우하는 사용자들 리스트를 읽어 들인다.

4. 팔로우하는 사용자 리스트에 해당 사용자의 아이디도 추가한다. 

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

 

 

Reference

깔끔한 파이썬 탄탄한 백엔드

 

 

 

'Web programing > Flask' 카테고리의 다른 글

Flask - pytest  (1) 2019.11.23
Flask 시작하기(1)  (0) 2019.05.01
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함