본문 바로가기
카테고리 없음

Django serializer 를 활용한 회원가입 / 탈퇴 기능 코드 해설

by abccoco 2022. 6. 29.

장고에서 serializer 를 사용해 회원가입 / 탈퇴 기능을 구현해 보자.

각 코드에 대한 해설은 주석으로 확인 할 수 있다.

 

 

url와 model은 이미 만들었다고 가정하고 그 다음 작업들을 해 보도록 하자

views.py에서 회원가입을 작성해보자

# views.py
class UserView(APIView):

    # 회원가입
    def post(self, request):
    	# user_serializer 안에 Serializers.py의 UserSerializer의 request.data를 가져온다.
        user_serializer = UserSerializer(data=request.data)
		# 가져온 데이터의 is_valid 에 raise_exception=True 를 넣어주어 데이터가 유효한지
        # 검사해주고 유효하지 않다면 bad request 에러를 보내준다
        if user_serializer.is_valid(raise_exception=True):
        	# 유효한 경우 저장하고 "messages"를 보내준다.
            user_serializer.save()
            return Response({"messages" : "가입 성공"})

        else:
            print(serializers.errors)
            return Response({"messages" : "가입 실패"})

 

views.py에서 로그인 기능을 만들어 보자

# views.py
# 로그인 기능을 쉽게 구현해주는 import
from django.contrib.auth import login, authenticate

class UserApiView(APIView):
    # 로그인
    def post(self, request):
    	#username, password를 가져온다
        username = request.data.get('username', '')
        password = request.data.get('password', '')
		# authenticatesms() 는 장고에서 제공하는 인증 함수이다.
        # username, password가 유효한지 확인해 준다.
        user = authenticate(request, username=username, password=password)
        if not user:
            return Response({"error": "존재하지 않는 계정이거나 패스워드가 일치하지 않습니다."}, status=status.HTTP_401_UNAUTHORIZED)

        login(request, user)
        return Response({"message": "로그인 성공!!"}, status=status.HTTP_200_OK)

 

serializers.py 를 작성해 보자.

# serializers.py
from rest_framework import serializers
# User model을 import 해준다.
from user.models import User as UserModel


class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = UserModel
        fields = ["fullname", "username", "password"]

    def create(self, validated_data):
    	# pop 을 사용하면 password를 삭제하고 즉시 다시 생성해준다.
        # 헤싱이 되지 않은 비밀번호를 삭제하고 헤싱을 시켜 다시 저장해주기 위해 사용된다.
        password = validated_data.pop("password", None)
        user = UserModel(**validated_data)
        # set_password() 를 사용해 헤싱을 해준다.
        user.set_password(password)
        # 저장
        user.save()

        return user

 

 

댓글