Django Rest Framework으로 회원가입과 로그인 구현하기 2편에서는

views.py, serializers.py, urls.py의 코드를 살펴보도록 하겠다.

 

우선, 회원가입에 필요한 코드부터 살펴보겠다.

serializers.py에서 구현한 UserSerializer이다.

 

User = get_user_model()

class UserSerializer(serializers.ModelSerializer):
    password = serializers.CharField(write_only=True)
    class Meta:
        model = User
        fields = (
            "id",
            #"username",
            "password",
            "gender",
            "nickname",
            "birthdate",
            "email",
            "address",
        )
        read_only_fields = ("id",)

    def validate_email(self, obj):
        if email_isvalid(obj):
            return obj
        raise serializers.ValidationError('메일 형식이 올바르지 않습니다.')


    def validate_username(self, obj):
        if username_isvalid(obj):
            return obj
        raise serializers.ValidationError('닉네임은 한 글자 이상이어야 합니다.')

    def create(self, validated_data):
        #password = validated_data.get("password")
        user = super().create(validated_data)
        user.set_password(validated_data["password"])
        user.is_active = False
        user.save()
        return user

 

UserSerializer는 ModelSerializer를 상속받았고, id를 read_only_fields로 설정하였다.

따로 email과 username을 validate하는 함수를 작성하여 overriding 해주었으며

django의 set_password method를 이용하여 비밀번호를 설정하기 위해 create함수를 작성하였다.

 

다음 SignupView는 회원가입을 위한 view이다.

 

class SignupView(CreateAPIView):
    model = get_user_model()
    serializer_class = UserSerializer
    permission_classes = [AllowAny]

 

CreateAPIView를 상속받아 구현하였다.

 

Urls.py에 아래와 같이 경로를 추가해준다.

 

path("signup/", views.SignupView.as_view()),

회원가입 페이지

 

회원가입 완성! DRF를 이용하여 매우 간단하게 구현 가능하다.

 

다음은 로그인이다.

로그인을 구현하기 위해서는 jwt에 대한 기본적인 개념과 활용 방법에 대한 지식이 필요하다.

이 프로젝트에서는 simple jwt를 사용하여 authentication을 진행하였고, JWT를 생성해주는 것은 아직 우리에게 익숙한 django-restframework-jwt를 이용하였다. 

 

pip install djangorestframework-simplejwt

pip install djangorestframework djangorestframework-jwt

 

이 명령어로 설치를 진행한다.

그 다음, settings.py에 Installed_Apps에 저장해주고, 아래와 같은 코드를 추가해준다.

JWT_AUTH 설정을 통해 암호화 알고리즘, 유효기간, 갱신 기간 등을 설정해준다. 

 

REST_FRAMEWORK = {
    "DEFAULT_PERMISSION_CLASSES": ["rest_framework.permissions.IsAuthenticated",],
    "DEFAULT_AUTHENTICATION_CLASSES": [
        "rest_framework_simplejwt.authentication.JWTAuthentication",
        "rest_framework.authentication.SessionAuthentication",
    ],
}

JWT_AUTH = {
    "JWT_SECRET_KEY": SECRET_KEY, 
    "JWT_ALGORITHM": "HS256", # 암호화 알고리즘
    "JWT_ALLOW_REFRESH": True,
    "JWT_EXPIRATION_DELTA": timedelta(days=7), # 유효기간
    "JWT_REFRESH_EXPIRATION_DELTA": timedelta(days=28), # JWT 토큰 갱신 유효기간
}

 

로그인을 위해 작성한 이다. 

 

JWT_PAYLOAD_HANDLER = api_settings.JWT_PAYLOAD_HANDLER
JWT_ENCODE_HANDLER = api_settings.JWT_ENCODE_HANDLER
class UserLoginSerializer(serializers.Serializer):
    email = serializers.CharField(max_length=64)
    password = serializers.CharField(max_length=128, write_only=True)
    token = serializers.CharField(max_length=255, read_only=True)

    def validate(self, data):
        email = data.get("email", None)
        password = data.get("password", None)
        user = authenticate(email=email, password=password)
        
        if user is None:
            return {
                'email': 'None'
            }

        try:
            payload = JWT_PAYLOAD_HANDLER(user)
            jwt_token = JWT_ENCODE_HANDLER(payload)
            update_last_login(None, user)
        
        except User.DoesNotExist:
            raise serializers.ValidationError(
                'User with given email and password does not exist'
            )
        return {
            'email': user.email,
            'token': jwt_token
        }

 

UserLoginSerializer는 serializer를 상속받아, JWT_PAYLOAD_HANDLER와 JWT_ENCODE_HANDLER를 이용하여 

수동으로 JWT를 생성해주고, email과 token을 함께 return 해준다.

 

아래는 Login view 함수이다. 

serializer가 valid한지 확인한 다음, valid하다면 token과 함께 응답한다. 

 

@api_view(['POST'])
@permission_classes([AllowAny])
def Login(request):
    if request.method == 'POST':
        serializer = UserLoginSerializer(data=request.data)

        if not serializer.is_valid(raise_exception=True):
            return Response({"message": "Request Body Error"}, status=status.HTTP_409_CONFLICT)
        if serializer.validated_data['email'] == "None":
            return Response({"message": 'fail'}, status=status.HTTP_200_OK)
        response = {
            'success': True,
            'token': serializer.data['token']
        }
        return Response(response, status=status.HTTP_200_OK)

 

마지막으로 url 추가~

 

path('login/', views.Login),​

 

로그인 페이지

 

로그인 성공~~

 

여기까지 하면 회원가입과 로그인 구현이 끝이 났다. 

JWT를 이해하고 있다면, 그리고 django rest framework를 이해하고 있다면 

그다지 어렵지 않은 과정이었다.

 

다음 3편에서는 user detail, 유저 정보를 확인하는 방법에 대해 알아보도록 하겠다.

 

BELATED ARTICLES

more