Westagram with Django 5일차

멘토님 리뷰를 하나씩 수정하며 다시 코드에 대한 정리와 인증 인가를 복습하는 시간 + Mission7 Follow 진행

1. 리뷰 내용

  1. 가독성 위한 로직별 분리 띄어쓰기 2회 피드백

  2. (회원가입시) 패스워드는 중복되어도 괜찮다. 고로 로직 때 코드 빼기

  3. 잘한점 : 암호화 과정(근데 아직 이해가 덜 된 부분이 많아서 다른 분들 코드 보면 내꺼랑 달라 이해하지 못 하는 것이 많다. 공부 더 해야겠다.)

  4. create 다음에 save()는 필요 없다.

  5. get() 으로 이메일 가져오는 메서드 사용할 시 꼭 잡아줘야 할 exception찾기

try:
    user = User.objects.get(email=data['email'])
            except User.DoesNotExist:
                return JsonResponse({"message":"USER_DOES_NOT_EXIST"}, status=400)
  • django 메뉴얼에도 나와있다고 하는데 유저가 있는지 없는지를 판별해내는 예외처리라고 한다. 알아두면 if 문을 쓰지 않아도 충분히 거를 것 같다.
  1. jwt 생성 로직까지 완료 후 사용하는 스텝 :
            if bcrypt.checkpw(data['password'].encode('utf-8'), user.password.encode('utf-8')):
                token = jwt.encode({'email' : data['email']}, SECRET_KEY, algorithm="HS256")
                return JsonResponse({'token' : token, "message":"SUCCESS"}, status=200)

아마 토큰이 만들어졌다고 확인해서 보내주는 과정이 필요하지 않을까 싶다. 근데 이게 정답인거 같진 않아서 잠시 고민 더 해봐야겠다.

  1. 불필요한 else문 제거 : if가 있을 시 들여쓰기로 return 값 조정

  2. 추가 수정 사항 :
    해쉬 중 마지막에 디코드 안 하고 끝냈더니 나중에 데이터베이스 밀고 다시 회원가입 및 로그인 했을 때 로그인이 안 되는 현상 발견. 꼭 디코드로 닫아주기.

2. Mission7

  • 현재 방향 : 앱을 따로 생성 안 하고 account 앱에서 ManytoMany로 모델링 하는 중.
  • 시행 중 너무 많은 에러가 발생하여 알아보니 내가 취약한 부분 발견
  1. 쉘로 결과 확인 잘 못 함.
  2. 1:다 모델도 구두로 설명이 안 되는데 다:다 를 하려니 당연히 어려움.
  • 그래서 수행한 것 :
  1. 장고 쉘 사용법 다시 익히기(데이터베이스 다 날려서 회원가입 계정 만드는 것 빼곤 다 쉘로 작성)

  2. 다:다 관련한 자료 다시 찾아보기
    정리 블로그 : 셀프 참조. 다:다 내용 정리
    정리 블로그2 : 친구는 자동으로 서로 친구(True) 인데 팔로우는 맞팔 안 하면 안 되니까.
    장고 공식문서 파트

  3. 결정적 힌트 : Self Referencing Model

  • 상황이 한 테이블의 자료 내의 (즉 유저) 내용들끼리 서로 참조를 해야 하는 상황. 하나의 테이블을 써야 하므로 스스로를 참조하므로 self를 해야하는데 스스로 참조하는 모델을 검색해서 접근했어야 함.
  1. 그 힌트로 얻은 모델링 : 이 모델링의 결과 또한 앞서 했던 것 처럼 이중으로 나오지 않았다. 제대로 모델링 했다는 뜻.
from django.db import models

class User(models.Model):
    email    = models.EmailField(max_length=50, unique=True)
    password = models.CharField(max_length=100)
    relation = models.ManyToManyField('self', through='Follow', symmetrical=False)
    # follow는 유저간 관계라서 변수명 지음
    # self : 스스로 참조한다.
    # through : Follow 클래스로
    '''ymmetrical=False / 기본은 True, 친구로 예를 들면 두 참조가 친구면 서로 친구. 근데 False 값을 써줘야 하는 이유는 기본적으로 인스타는 맞팔이 아니기 때문. 누군가 팔로우를 해도 누군가는 팔로 안 할 수도 있으니까.'''

    class Meta:
        db_table = "users"
        
 
class Follow(models.Model):
    following = models.ForeignKey(User, on_delete = models.SET_NULL, null=True, related_name = "following")
    follower  = models.ForeignKey(User, on_delete = models.SET_NULL, null=True, related_name = "follower")
    # 다음은 팔로잉, 팔로어를 외래키로 모델링. 값은 NULL로 하고 관계된 이름을 정해준다.
    # 여기서 이름이 정확히 정해지지 않으면 참조가 원활히 이뤄지지 않는다.
    class Meta:
        db_table = "follows"
  1. 이후 제대로 되는지 확인하는 장고쉘
>>> from account.models import Follow
>>> Follow.objects.create(following=u1, follower=u2)
<Follow: Follow object (1)>
# 정확히 객체가 하나 생성되었다.

  1. views.py
    장고쉘을 이용하니 뷰 짜는것이 더 쉬웠다.
    views.py
class FollowView(View):
    def post(self, request):
            data      = json.loads(request.body)
            following = User.objects.get(email=data['following'])
            follower = User.objects.get(email=data['follower'])
            # 항상 데이터를 어디서 가져와야하는지 헷갈렸는데 장고쉘을 해본 덕에 금방 왜 그렇게 되는지 이해가 되었다.
            if following == follower:
                return JsonResponse({"message":"SAME_PERSON!"})
                # 자신이 자신을 팔로하지 못 하므로 예외를 둔다.
                follow = Follow.objects.create(
                    following = following,
                    follower  = follower
            )
            return JsonResponse({"message": "SUCCESS"}, status=200)

이렇게 위스타그램 미션7 팔로우 기능을 모두 수행하였다. 오래 고민한만큼 뭐 별 볼 일 없다고도 할 수 있겠지만 나에게는 무지 뿌듯한 챕터였다.

profile
커피 내리고 향 맡는거 좋아해요. 이것 저것 공부합니다.

0개의 댓글