TIL - flask 3

이동근·2021년 3월 19일

flask

목록 보기
3/3
post-thumbnail

팔로우와 언팔로우

Miniter에서 중요한 부분 중 하난가 또한 다른 트위터 들을 팔로우(언팔로우) 하고 팔로우 하는 사용자들의 글과 사진을 타임라인에서 볼 수 있는 기능이다.

내가 만든 코드


그래 여기까지는 했고 user에 대한 판별까지 했는데... 여기서..부터

완성 코드

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

  2. 만일 해당 사용자나 팔로우 할 사용자가 존재하지 않는다면 400 bad request를 보낸다.

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

  4. 만약 읽어들인 사용자의 정보를 담고 있는 딕셔너리가 이미 follow라는 필드를 가지고 있다면, 사용자의 follow 키와 연결되어 있는 set에 팔로우 하고자 하는 사용자 아이디를 추가한다.
    그렇지 않다면!
    follow라는 키를 'empty set'과 연결하여 추가한다.

    setdefault - 키가 존재하지 않으면 디폴트 값ㅇ르 저장하고, 칸일 키가 이미 존재하면 애당 값을 읽어 들이는 기능!

    follow endpoint를 구현할 때 해당 사용자가 팔로우 하는 다른 사용자들의 아이디를 저장하는 자료구조 로서 set을 사용한다. 그 이유는

만일 이미 팔로우하고 있는 사용자를 팔로우하는 요청이 왔을 경우에도 동일한 사용자 아이디가 여러번 저장되지 않게 해주기 때문이다.

그래서 굳이 팔오우하고자 하는 사용자 아이디가 이미 팔로우 되고 있지 않은지에 대한 확인을 굳이 해주지 않아도 된다.

그래서 실행을 시켜주면

오류가 나게 된다!

어떤 오류인지 보다고 하니

JSON화가 이루어 지지 않았다고 한다.
이에대한 해결 방법으로 우리의 깔파탄백에서는
python의 set은 JSON화가 되지 않기 때문에 다른 코드를 추가 해줘야 한다.

그것은
쉽게말해서 JsonDecoder의 능력을 좀 더 확장 시켜준다고 생각하면 된다.
dict와 list의 형태만 읽을 수 있는 JsonDecoder를 만들어 준다.

CustomJSONEncoder(JsonEncoder) class를 만들어 준다.
그래서 default 함수를 만들어 두는데 파라미터로 self, obj(객체, object의 줄임말) 가진다.
그래서 만약 isinstance가(객체가 set)이면 return list(obj)로 변황을 시켜주고
JSONEncoder.default값으로 설정을 해준다.

그리고 *app.json.encoder = CustomJSONEncoder를 실행해 줌으로써 app.py에 들어 있는 json data들은 무조건 list로 나오게 된다.

언팔로우

팔로우와 다르지 않다

다른 점은 user.setdefault('unfollow', set()).discard(user_id_to_follow)로 변경 됬을 뿐이다.

-> remove 대신 discard의 차이점을 보게 되면 set()함수에서 remove는 지우려는 element가 없으면 'keyerror'를 뿜지만, discard는 제대로 실행이 된다. 그래서 remove말고 discard를 사용했다.

그 결과

언팔 완료!!

타임라인 엔드 포인트

사용자의 트윗들 그리고 팔로우하느 사용자들의 트윗들을 리턴해 주는 엔드포인트 이다. 단순히 데이터만 받아오는 형태 이기 때문에 'GET'이 된다.

여태까지 저장했던 데이터들을 GET 메소드를 통해 가져 오면 된다.
오타를 수정하고 실행을 시켜보면

200 OK 성공!!


전체코드

  • flask를 맛보는 중~~!

깔끔한 파이썬 탄탄한 백엔드 - 저자 송은우

profile
하루하루 1cm 자라는 개발자

0개의 댓글