flask minitwit -4 (팔로우 언팔로우, customEncoder, setdefault())
출처 : 책 <깔끔한 파이썬="" 탄탄한="" 백엔드="">깔끔한>
개발환경 : 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() 를 사용해서 중복되는 값이 없도록 만든다
Comments