flask minitwit -4 (팔로우 언팔로우, customEncoder, setdefault())

1 minute read

출처 : 책 <깔끔한 파이썬="" 탄탄한="" 백엔드="">

개발환경 : ubuntu, vim, vscode

언어 및 프레임워크 : Python3, Flask

GIthub repository : YChaeeun/miniTwit_web

팔로우 & 언팔로우

  • app.py

    @app.route('/follow', methods=['POST'])
    def follow() :
        playload              = request.json
        user_id               = int(playload['id'])
        user_to_follow_id     = int(playload['follow'])
      
      
        if user_id not in app.user or user_to_follow_id not in app.user :
            return '사용자가 존재하지 않습니다', 400
      
        user = app.users[user_id]
      
        user.setdefault('follow', set()).add(user_to_follow_id)
        return jsonify(user)
    
    • 언팔로우는 set에 추가되어 있는 follow 정보를 삭제하면 된다

    • add() 함수 대신 discard() 함수를 사용하면 된다

      • discard() 는 삭제하고자 하는 요소가 없다면 무시한다 (remove()는 그럴 경우 에러)
      user.setdefault('follow', set()).discard(user_to_follow_id)
      

커스텀 인코더 구현

  • set() 은 JSON으로 변환이 안되기 때문에 직접 JSON 엔코더를 구현해서 set을 list로 바꿔준다

    from flask.json import JSONEncoder
    
    class CustomJSONEncoder(JSONEncoder) :
        def default(self, obj) :
            if isinstance(obj,set) :	# obj가 set라면 list로 형변환한다
                return list(obj)
            return JSONEncoder.default(self,obj) 
            # 해당하지 않으면 기존의 엔코더(JSONEncoder)의 default 함수 사용하기
          
    app.json_encoder = CustomJSONEncoder
    # jsonify 함수가 호출될 때 마다 JSONEncoder가 아닌 CustomJSONEncoder 클래스 사용
    
    • JSONEncoder 클래스의 default 함수 확장 (over-write)
    • isinstance(object, classinfo) : object가 classinfo 객체인지 판별해 준다

dict.setdefault(key, default_value)

  • 만약 dictionary에 key 값이 없다면 key : default_value 를 추가한다

  • key 값이 있다면 default_value 무시

    dicA = {'a':1, 'b':2}
    dicA.setdefault('a', 0)	# {'a':1, 'b':2}
    dicA.setdefault('c',3)		# {'a':1, 'b':2, 'c':3}
    
    • 첫번째 setdefault 는 dicA에 이미 ‘a’ 가 key값으로 있기 때문에 default_value를 무시
    • 두번째 setdefault는 dicA에 ‘c’ 가 없기 때문에 ‘c’ : 3 을 dicA에 추가해 준다
  • user.setdefault(‘follow’, set()).add(user_to_follow_id)

    user = {'id' : 1, 'name' : 'ychae'}
    user.setdefault('follow', set()).add('follow_id_1')
    print(user)  # {'id': 1, 'name': 'ychae', 'follow': {'follow_id_1'}}
      
    user.setdefault('follow', set()).add('follow_id_2')
    print(user)  # {'id': 1, 'name': 'ychae', 'follow': {'follow_id_1', 'follow_id_2'}}
    
    • 이때 add() 는 set() 에 값을 추가할 때 사용하는 함수!
    • set() 를 사용해서 중복되는 값이 없도록 만든다

http -v POST … id:=1 follow:=2

twit-4

http -v POST localhost:5000/unfollow id:=1 unfollow:=2

twit-5

Categories:

Updated:

Comments