현제의 현재이야기
[KLAE] 0103 개발일지 본문
코멘트 숫자 함수 작성
views.py
#한 게시물 조회
@api_view(['GET'])
@authentication_classes([SessionAuthentication, BasicAuthentication])
@permission_classes([IsAuthenticated])
def get_one_post(request, pk):
try:
post = Post.objects.get(pk=pk)
comments = Comment.objects.filter(post__id = pk)
post.comment_cnt = comments.count()
post.save(update_fields=['comment_cnt'])
serializer = GetSerializer(post)
return Response(serializer.data)
except Post.DoesNotExist:
return Response(status = status.HTTP_404_NOT_FOUND)
#댓글 수만 보내주기
@api_view(['GET'])
@authentication_classes([SessionAuthentication, BasicAuthentication])
@permission_classes([IsAuthenticated])
def get_comment_cnt(request, pk):
try:
post = Post.objects.get(pk=pk)
comments = Comment.objects.filter(post__id = pk)
post.comment_cnt = comments.count()
post.save(update_fields=['comment_cnt'])
serializer = CommentCntSerializer(post)
return Response(serializer.data)
except Post.DoesNotExist:
return Response(status = status.HTTP_404_NOT_FOUND)
- 쿼리셋에도 count() 가 가능하다.
로그인을 이메일로
models.py
class User(AbstractUser):
password = models.CharField(max_length=512)
email = models.CharField(max_length=50,unique = True)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = []
select = models.CharField(max_length=50, null=True)
profile_image = models.ImageField(upload_to='profile', null=True)
username = models.CharField(max_length=10,unique = True ,null=True)
class LoginSerializer(serializers.Serializer):
email = serializers.CharField(required = True)
password = serializers.CharField(required = True)
@api_view(['POST'])
def login(request):
serializer = LoginSerializer(data=request.data)
if serializer.is_valid():
user = auth.authenticate(
request=request,
email=serializer.data['email'],
password=serializer.data['password']
)
if user is not None:
auth.login(request, user)
return Response(status=status.HTTP_200_OK)
return Response(status=status.HTTP_404_NOT_FOUND)
return Response(status=status.HTTP_400_BAD_REQUEST)
- 기존은 username으로만 로그인이 가능해서 views.py와 시리얼라이저의 username으로 되어 있는 것을 email로 바꾸어도 404 not found 에러가 떴었음.
- 알고보니 USERNAME_FIELD의 값을 직접 바꿔 줘야했음. 그리고 REQUIRED_FIELDS에 있던 email을 비워주어야 이메일로 로그인이 가능하다.
- username은 단순하게 지울 수 있는 것이 아니라, 생각보다 DRF내 많은 함수에 참조되었다. 그래서 email을 unique로 만들기 위해 username을 삭제하고 name이라는 필드를 만들었었는데 치명적인 오류들이 줄줄이 나왔다.
- 예를 들어 뭐 어딘가에서 username을 참조하지 못했다, 어쩌구 저쩌구
- 그래서 username은 단순한 변수가 아니라 USERNAME_FIELD라는 것이 있을 만큼 로그인에서 중요한 것이었음.
- rest_auth와 allauth라는 훌륭한 drf 로그인 방식이 있었다. 이는 settings.py에서 슬쩍만 바꾸면 될만큼 설정이 쉬운 로그인 방식이며, views.py에 함수도 적지 않아도 된다. 또한 소셜로그인도 아주 쉽게 구현이 되는 것 같다
- 다음 프로젝트 때는 반드시 .. 로그인 관련 app과 커뮤니티 app을 나누어야겠다.
+) userplant 추가 필드 두 개를 만들었다.
하고 싶은 것
- 이메일 인증도 해보고 싶다. -> 고도화때 해보아야 하나?
'DRF > KLAE' 카테고리의 다른 글
[KLAE] 0106 개발일지 (0) | 2023.01.06 |
---|---|
[KLAE] 0105 개발일지 (0) | 2023.01.05 |
[KLAE] 0102 개발일지 (1) | 2023.01.02 |
[KLAE] 1230 개발일지 (0) | 2022.12.30 |
[KLAE] 1229 개발일지 (0) | 2022.12.29 |
Comments