현제의 현재이야기

[KLAE] 0103 개발일지 본문

DRF/KLAE

[KLAE] 0103 개발일지

현재의 현제 2023. 1. 4. 01:58

코멘트 숫자 함수 작성

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