멘토님 리뷰를 하나씩 수정하며 다시 코드에 대한 정리와 인증 인가를 복습하는 시간 + Mission7 Follow 진행
가독성 위한 로직별 분리 띄어쓰기 2회 피드백
(회원가입시) 패스워드는 중복되어도 괜찮다. 고로 로직 때 코드 빼기
잘한점 : 암호화 과정(근데 아직 이해가 덜 된 부분이 많아서 다른 분들 코드 보면 내꺼랑 달라 이해하지 못 하는 것이 많다. 공부 더 해야겠다.)
create 다음에 save()는 필요 없다.
get() 으로 이메일 가져오는 메서드 사용할 시 꼭 잡아줘야 할 exception찾기
try:
user = User.objects.get(email=data['email'])
except User.DoesNotExist:
return JsonResponse({"message":"USER_DOES_NOT_EXIST"}, status=400)
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)
아마 토큰이 만들어졌다고 확인해서 보내주는 과정이 필요하지 않을까 싶다. 근데 이게 정답인거 같진 않아서 잠시 고민 더 해봐야겠다.
불필요한 else문 제거 : if가 있을 시 들여쓰기로 return 값 조정
추가 수정 사항 :
해쉬 중 마지막에 디코드 안 하고 끝냈더니 나중에 데이터베이스 밀고 다시 회원가입 및 로그인 했을 때 로그인이 안 되는 현상 발견. 꼭 디코드로 닫아주기.
장고 쉘 사용법 다시 익히기(데이터베이스 다 날려서 회원가입 계정 만드는 것 빼곤 다 쉘로 작성)
다:다 관련한 자료 다시 찾아보기
정리 블로그 : 셀프 참조. 다:다 내용 정리
정리 블로그2 : 친구는 자동으로 서로 친구(True) 인데 팔로우는 맞팔 안 하면 안 되니까.
장고 공식문서 파트
결정적 힌트 : Self Referencing Model
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"
>>> from account.models import Follow
>>> Follow.objects.create(following=u1, follower=u2)
<Follow: Follow object (1)>
# 정확히 객체가 하나 생성되었다.
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 팔로우 기능을 모두 수행하였다. 오래 고민한만큼 뭐 별 볼 일 없다고도 할 수 있겠지만 나에게는 무지 뿌듯한 챕터였다.