# 팔로우
@app.route('/follow', methods = ["GET","POST"])
def follow() :
payload = request.json # 1
user_id = int(payload['id'])
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]
user.setdefault('follow', set()).add(user_id_to_follow) # 4
return jsonify(user)
# 언팔로우
@app.route('/unfollow', methods = ["GET","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) # 5
return jsonify(user)
# 1 : 요청 데이터 저장 (id:사용자 아이디, follow : 팔로우 할 사용자의 아이디)
# 2 : 팔로우 할 사용자 저장
# 3 : 저장된 사용자나 팔로우 할 사용자가 없을 경우 메시지 return
# 4 : 이전에 팔로우 한 적이 있는 경우 : 'follow'라는 필드가 있으면 set에 사용자 아이디 추가.
처음 팔로우 하는 경우 : 사용자 정보를 담고있는 딕셔너리에 'follow' 키를 빈 set()과 연결하여 추가
setdefault : 키가 없는 경우 디폴트 값을 저장, 키가 있으면 해당 키 값을 저장. (하단에 설명 추가)
# 5 : 팔로우 할 사람을 discard. (remove는 값(팔로우 한 사람)이 없으면 에러를 부르지만 discard는 값이 없으면 무시하고 넘어감)
1. HTTP 요청 보내기
http -v POST localhost:8080/follow id:=1 follow:=2
결과
데이터베이스를 아직 연결하지 않아 첫번째 사용자 등록 요청을 한 후 팔로우 요청을 보내면 id=2 값을 가진 사용자가 없어
사용자가 없다는 메시지가 뜬다.
- 원래 맨 처음 실행할때는 set을 json모듈 JSON으로 변경하지 못한다는 TypeError가 뜸
- TypeError: Object of type set is not JSON serializable
2 . 다음 코드를 추가해야 함
from flask.json import JSONEncoder # JSONEncoder 호출
# 파이썬 set을 JSON으로 불러오기
class CustomJSONEncoder(JSONEncoder) : # JSONEncoder 클래스 -> 부모클래스(CustomJSONEncoder)로 상속
def default(self, obj) : # JSONEncoder default 메소드를 덮어쓰기(over-write)
if isinstance(obj,set) : # set을 list로 바꿔줌
return list(obj)
return JSONEncoder.default(self,obj) # 객체가 set이 아닌 경우 원래의 메소드 호출 후 리턴
app.json_encoder = CustomJSONEncoder # CustomJSONEncoder를 플라스크의 디폴트 JSON엔코더로 지정
# jsonify 함수 호출 시 CustomJSONEncoder 클래스 사용됨
setdefault(key[, default])
key 가 딕셔너리에 있으면 해당 값을 돌려준다. 그렇지 않으면, default 값을 갖는 key 를 삽입한 후 default 를 돌려준다.
default 의 기본값은 None
기본 예제) 각 숫자가 몇 개 있는지 카운트
numbers = [1,2,6,8,4,3,2,1,9,5,4,9,7,2,1,3,5,4,8,9,7,2,3]
counter = dict()
for number in numbers :
if number in counter : #리스트 안에 있는 숫자들이 새로운 딕셔너리 안에 있으면
counter[number] += 1 # 1씩 더해서 카운트해줌
else :
counter[number] = 1 # 새로운 딕셔너리에 없으면 그 숫자에 카운트 1 생성
print(counter)
{1: 3, 2: 4, 6: 1, 8: 2, 4: 3, 3: 3, 9: 3, 5: 2, 7: 2}
setdefualt 사용
numbers = [1,2,6,8,4,3,2,1,9,5,4,9,7,2,1,3,5,4,8,9,7,2,3]
counter = dict()
for number in numbers: # 리스트 안에 숫자 탐색
counter.setdefault(number, 0) # 딕셔너리가 비어있으니 default값을 설정해주고 key값인 number를 넣어줌
counter[number] += 1 # key값에 해당하는 숫자의 개수를 하나씩 올려줌
print(counter)
{1: 3, 2: 4, 6: 1, 8: 2, 4: 3, 3: 3, 9: 3, 5: 2, 7: 2}
set()
- 해당 사용자가 다른 사용자를 팔로우 할 때, 다른 사용자의 아이디를 저장하는 자료구조로 set 사용
- 이미 팔로우 하고 있는 경우 그 사용자를 팔로우 하는 요청이 올 때 동일한 사용자가 중복 저장되는 걸 방지
- 이미 팔로우 했는지 안했는지 확인 할 필요가 없음
'Python > Flask' 카테고리의 다른 글
[미니터] sqlalchemy를 사용한 API와 DB 연결 (0) | 2022.07.12 |
---|---|
[미니터] 타임라인 (0) | 2022.07.07 |
[미니터] 트윗올리기 (0) | 2022.07.06 |
[미니터] 회원가입 엔드포인트 (0) | 2022.07.06 |
[미니터] 객체 생성, 엔드포인트 등록 (0) | 2022.07.05 |