Django REST Framework(DRF)로 회원가입/로그인/로그아웃 하기

2021. 5. 17. 17:29Dev/Django

#Django REST Framework(DRF)

- Django의 오픈소스 웹 프레임워크 중 하나.

Django에서 RESTful API,

즉 GET, POST, DELETE, PUT 등의 REST API를 활용할 수 있게 해주는 Framework이다.

Django는 MTV(Model + Template + View) 모델인데, MVC(Model + View + Controller) 모델에서 이름만 바뀐 것이라고 생각하면 된다. 쉽게 말해서, Django에서 로직을 처리하는 부분 view.py, 뷰를 담당하는 부분은 template 디렉토리라고 생각하면 된다.

그런데 Django의 MTV모델을 그대로 사용할 경우 프론트엔드 개발자도 장고를 알아야하고, 백엔드 개발자도 프론트엔드 개발을 어느 정도 할 줄 알아야하는 단점이 있다. 왜냐하면 template, 즉 프론트엔드 개발이 담당하는 뷰 부분이 django 내에서 동작하기 때문이다.

따라서 REST를 통해 Django를 통한 백엔드 개발에서 상태와 값만을 프론트로 넘겨주고, 프론트엔드 개발자는 React.js / Vue.js 등의 여러 프론트엔드 프레임워크를 활용하여 개발을 하는 것이 이상적이다.

DRF는 Serialize(직렬화)와 Deserialize(역직렬화)라는 강력한 기능 또한 제공한다. 이는 쉽게 말해 Django의 Object를 json 등의 형태의 데이터로 변형(Serialize)하여 client로 보내고, 또한 client로부터 받은 데이터를 역직렬화하여 Django가 알아먹을 수 있는 Object로 변형해주기도 한다.

이것이 DRF(Django Rest Framework)의 필요성이다.

일단 설치를 해보자.

pip3 install djangorestframework

이렇게 DRF를 설치하고 나면 아래와 같이 DRF를 import해서 사용할 수 있다.

from rest_framework import status
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.permissions import AllowAny
from rest_framework.decorators import permission_classes
from rest_framework_jwt.views import RefreshJSONWebToken
from .models import User

...

 

#DRF를 활용한 회원가입 / 로그인  / 로그아웃

Django는 기본적으로 유저 인증 관련 모델을 지원하고, 나는 현재 기존의 user 모델을 커스텀한 모델을 사용하려 한다.

유저 인증을 지원하기 때문에, 유저 인증 라이브러리를 사용하여 구현을 하려 한다.

사실 직접 구현하는게 더 익숙하기도 하고, 내 맘대로 커스텀 할 수 있는게 장점이긴 한데 token 관련해서 겁나게 삽질하고.. 하다가 열받아서 그냥 라이브러리 써보자 해서 라이브러리를 쓴다.

또한 Django의 주요 가치를 다시 한번 생각해보면


Django was invented to meet fast-moving newsroom deadlines, while satisfying the tough requirements of experienced Web developers.


 Django는 "우리가 너네 작업하는거 귀찮은거 다 알고 그거 다 구현해 놨으니 갖다 써~" 라고 말하고 있다..

그래서 써본다. 나도. Django 라이브러리.

 

#DRF의 rest-auth 활용하여 설치 및 설정

유저 인증 모듈부터 설치하자.

pip3 install django-rest-auth
pip3 install django-allauth
  • django-rest-auth

Django의 회원가입 및 로그인

  • django-allauth

소셜 로그인 구현 가능..?

 

이 라이브러리들을 이용하여 회원가입 및 로그인, 로그아웃을 진행하도록 한다.

일단 기본적으로 로그인을 할 경우 로그인 된 유저의 token을 발급하고 이 token으로 인증을 관리해야 하는데, 이 token을 직접 만들고 관리하는게 생각보다 django에서 어렵고 귀찮아서 library 를 활용하여 관리를 쉽게 하려고 한다.

라이브러리를 설치했으면, settings.py의 값을 수정해야 한다.

INSTALLED_APPS = [
   	...
    
    'django.contrib.sites',
    'allauth',
    'allauth.account',
    'allauth.socialaccount',
    'rest_framework',
    'rest_framework.authtoken',
    'rest_auth',
    'rest_auth.registration',
    
    ...
]

...

ACCOUNT_AUTHENTICATION_METHOD = 'email'
ACCOUNT_EMAIL_VERIFICATION = "none"
ACCOUNT_EMAIL_REQUIRED = True
ACCOUNT_USERNAME_REQUIRED = False
ACCOUNT_USER_MODEL_USERNAME_FIELD = None

REST_AUTH_SERIALIZERS = {     
    'USER_DETAILS_SERIALIZER':'user.serializers.UserSerializer' 
}

REST_AUTH_REGISTER_SERIALIZERS = {
    'REGISTER_SERIALIZER' : 'user.serializers.RegisterSerializer',
}

...

먼저 나는 email 필드로 인증을 할 것이기 때문에, ACCOUNT_AUTHENTICATION_METHOD 값을 수정했다. 이 외에 email과 관련된 값을 설정을 했고, 

또 중요한 것이, 나처럼 custom User model을 사용한다면 인증 필드를 반드시 변경해줘야 한다.

이후 설명할 것이지만 DRF의 가장 강력한 기능 중 하나인 Serializer를 작성을 해줘야하고, 이를 통해 Object를 client가 알아들을 수 있는 데이터로 변형을 해줘야 하는데, custom User Model을 사용하고 아무 설정을 하지 않는다면 회원가입 / 로그인 등을 진행할 때, username이 없다고 해서 에러가 생길 수 있다.

USER_DETAILS_SERIALIZER = django.contrib.auth.User

이것이 기본 세팅이기 때문인데, 이 설정을 아래와 같이 settings.py에 추가해줘야 한다.

...

REST_AUTH_SERIALIZERS = {     
    'USER_DETAILS_SERIALIZER':'user.serializers.UserSerializer' 
}


REST_AUTH_REGISTER_SERIALIZERS = {
    'REGISTER_SERIALIZER' : 'user.serializers.RegisterSerializer',
}

...

위의 serializers를 설정을 해 보자. 각각은 로그인/로그아웃과 회원가입에 관한 serializer이다. 두 가지를 나눠서 설정을 해 줘야 한다.

참고로 위에 있는 내용을 설정하지 않으면, 에러가 나고 나처럼 계속 삽질할 수 있다..

  • allauth : 인증이 안 되거나, error에서 allauth 관련한 에러가 나기 때문에 'allauth', 'allauth.account', 'allauth.socialaccount' 모두 추가해주자. social 연동을 하지 않더라도 에러가 날 수 있기 때문에 마지막의 socialaccount를 추가해주자.
  • rest_framework : DRF를 사용할 것이니 당연히 추가해줘야한다.
  • rest_auth : rest_auth url로 요청해서 로그인 및 로그아웃 할 것이기에 추가해준다.
  • rest_auth.registration : 회원가입은 따로 추가해줘야 한다.

 

#Serializers 작성

모델이 작성된 폴더에 serializers.py를 만들고, 아래와 같이 작성한다.

from rest_framework import serializers
from .models import User

class UserSerializer(serializers.ModelSerializer) :
    class Meta :
        model = User
        fields = ['email', 'name', 'date_joined']

class RegisterSerializer(serializers.ModelSerializer) :
    class Meta :
        model = User
        fields = ['email', 'password']

    def save(self, request) :
        user = User.objects.create_user(
            request.data['email'],
            request.data['name'],
            request.data['password']
        )
        return user

rest-auth는 로그인 / 로그아웃과 회원가입을 구분하여 실행하기에, 두 가지 Serializer를 모두 작성해줘야 한다.

주의해야 할 점은 RegisterSerializer이다. save를 반드시 정의해야한다. save를 정의하지 않으면, 회원가입을 성공할 수 없다.

 

#URL 작성

urls.py에 들어가서 아래와 같이 작성하자.

from django.urls import path, include

app_name = 'user'
urlpatterns = [
    path('api-auth/', include('rest_framework.urls')),
    path('rest-auth/', include('rest_auth.urls')),
    path('rest-auth/registration/', include('rest_auth.registration.urls'))
]

2번째 line과 3번째 line을 보자.

  • rest-auth/

 rest-auth/login/ 으로 post 요청하면 로그인 되고, rest-auth/logout/ 으로 post요청하면 로그아웃 된다.

  • rest-auth/registration/

이 주소로 POST 요청하면, 입력 받은 값을 토대로 회원가입을 완료한다.

 

#회원가입, 로그인, 로그아웃 해보기

이렇게 진행하고 postman으로 회원가입 및 로그인, 로그아웃을 진행해보자.

회원가입
localhost:8000/admin/ 에 잘 등록된 것을 확인 가능하다.

 

로그인

 

로그아웃

 

모두 정상적으로 진행 된 것을 알 수 있다.

물론 다른 프로젝트에 더 집중하느라 그런 것도 있지만, 이거 하느라 거진 이틀을 소비했다.. 몇시간이면 금방 할 줄 알았는데 은근히 user model custom하고 세팅 다 바꾸고 하는게 오히려 더 많은 시간 잡아먹은 것 같았다.

그래도 이제 user model은 완료했고, 다른 model들은 기존의 model을 상속받는게 아니니 조금 수월할 듯 싶다.

 

 

 

출처 : 

https://www.rootstrap.com/blog/registration-and-authentication-in-django-apps-with-dj-rest-auth/

 

Registration and Authentication in Django apps with dj-rest-auth | Rootstrap Blog

A huge amount of existing applications have registration and authentication for users. Maybe every developer in the world has implemented something related to this in their work or while they learned. After the creation of the Django REST framework, Djang

www.rootstrap.com

https://supplementary.tistory.com/294

 

[Project] 로그인 / 로그아웃 / 회원가입

로그인, 페이스북 로그인을 하려면, 멋진 django rest auth라는 패키지를 설치해야 한다. 이것은 로그인, 로그아웃, 리셋, 컨펌, 변경, 소셜로그인.. 설치 pipenv install django-rest-auth 해당 코드 추가 INSTAL.

supplementary.tistory.com

 

'Dev > Django' 카테고리의 다른 글

Django User DB 커스텀하기  (0) 2021.05.15
Django 시작하기 #2 - View, Template  (0) 2021.04.11
Django 시작하기 #1 - App, DBMS 설정  (0) 2021.04.05
Django란?  (0) 2021.03.30