본문 바로가기
Django

[D.R.F] 커스텀 유저 구현하기 - 회원가입, 로그인

by Shark_상어 2023. 1. 5.
728x90

안녕하세요.

 

오늘 Django RESTful API로 회원정보를 관리(회원가입/로그인) 구현 해보도록 하겠습니다.

 

Django에서는 기본적으로 사용자 모델인 User 모델을 제공하고 있어요

 

하지만 임의로 원하는 필드(ex. 닉네임이나 유저 등급 등)를 가진 사용자 모델을 사용하기 위해서는

 

custom user 모델을 구현해야 합니다!!!!

 

Djago의 custom user에 관한 내용은 아래의 공식 문서를 참고하였습니다.

 

[여기] 클릭해주세요

 

custom user 모델을 구현하기 위해서는 BaseUserManager AbstractBaseUser 클래스를 상속받아 새롭게 구현해야 합니다.

 

여기서 BaseUserManager는 유저를 생성하는 역할을 하는 헬퍼 클래스입니다.

 

AbstractBaseUser는 실제 모델이 상속받아 생성하는 클래스입니다.

 

custom user 코드를 작성 하기 전에 우선 가상환경 생성과 프로젝트 생성을 해보도록 하겠습니다.

 

가상환경 생성 방법:(프로젝트를 생성 하기 위해서 해당 폴더 터미널 에서 아래와 같이 명령어를 입력!!!)

# 가상환경 생성 방법 입니다.
# 저는 임의의 이름의 가상환경 파일을 만들고자 할때 python -m venv 원하는이름 으로 작성하시면 됩니다.
python -m venv venv

 

 

# 이후 아래와 같이 명령어를 입력해주세요.
venv\Scripts\activate

 

그럼 요런 모양이 나온다면 성공한 것입니다.

 

 

이제 부터 가상환경 에서 Django 설치, rest_framework를 설치 해보도록 하겠습니다.

다음과 같이 명령어를 입력해주세요.

 

# package 설치
# 3.2.13버전이 릴리즈 버전이라서 저는 3.2.13으로 진행하였습니다.
pip install Django == 3.2.13
pip install djangorestframework

# 이제 프로젝트 와 app를 생성 하겠습니다.
# . 표시는 현재 폴더에 프로젝트를 생성하겠다는 의미입니다. 꼭 뒤에 .를 붙여주세요.
django-admin.py startproject pjt .
python manage.py startapp accounts

 

settings.py

settings.py에서 방금 생성한 accounts 앱 과 rest_framework을 등록해줍니다. 이후에 settings.py에 

AUTH_USER_MODEL = "accounts.User" 라는 문구를 아무곳에 넣어주세요.

장고에게 내가 만든 커스텀 모델이 회원이 될거야!! 라고 알려주는 거예요!!!

 

INSTALLED_APPS = [
    "rest_framework",
    "account",
]
 
 
AUTH_USER_MODEL = 'account.User'
 
 
urls.py

방금 생성한 accounts 앱에 urls.py 이라는 파일을 추가해줍니다.

from django.urls import path, include
from . import views
from rest_framework import urls

urlpatterns =[
    path('signup/', views.UserCreate.as_view()),
    path('api-auth/', include('rest_framework.urls')),
 ]

 

 

프로젝트명 urls.py

프로젝트 urls.py에 다음과 같이 넣어주세요.

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('user/', include('account.urls')),
 ]​

 

 

models.py
from django.db import models
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager

class UserManager(BaseUserManager):
    # 일반 user 생성
    def create_user(self, email, nickname, name, password=None):
        if not email:
            raise ValueError('must have user email')
        if not nickname:
            raise ValueError('must have user nickname')
        if not name:
            raise ValueError('must have user name')
        user = self.model(
            email = self.normalize_email(email),
            nickname = nickname,
            name = name
        )
        user.set_password(password)
        user.save(using=self._db)
        return user

    # 관리자 user 생성
    def create_superuser(self, email, nickname, name, password=None):
        user = self.create_user(
            email,
            password = password,
            nickname = nickname,
            name = name
        )
        user.is_admin = True
        user.save(using=self._db)
        return user

class User(AbstractBaseUser):
    id = models.AutoField(primary_key=True)
    email = models.EmailField(default='', max_length=100, null=False, blank=False, unique=True)
    nickname = models.CharField(default='', max_length=100, null=False, blank=False, unique=True)
    name = models.CharField(default='', max_length=100, null=False, blank=False)
    
    # User 모델의 필수 field
    is_active = models.BooleanField(default=True)    
    is_admin = models.BooleanField(default=False)
    
    # 헬퍼 클래스 사용
    objects = UserManager()

    # 사용자의 username field는 nickname으로 설정
    USERNAME_FIELD = 'nickname'
    # 필수로 작성해야하는 field
    REQUIRED_FIELDS = ['email', 'name']

    def __str__(self):
        return self.nickname

 

custom user 모델을 생성해준 이후, 마이그레이션을 진행합니다.

python manage.py makemigrations
python manage.py migrate

 

accounts 앱에 파일을 추가 해줍니다. serializers.py 이름으로 파일을 추가해줍니다.

serializers.py
from .models import User
from rest_framework import serializers

class UserSerializer(serializers.ModelSerializer):
    def create(self, validated_data):
        user = User.objects.create_user(
            email = validated_data['email'],
            nickname = validated_data['nickname'],
            name = validated_data['name'],
            password = validated_data['password']
        )
        return user
    class Meta:
        model = User
        fields = ['nickname', 'email', 'name', 'password']

 

 

다음으로는 생성한 User 모델을 기반으로 serializer를 작성해주었습니다.

 

serializer의 field로는 회원가입 시 입력을 받고자 하는 nickname, email, name, password로 설정하였습니다.

 

UserSerializer에서는 한 가지 주의해야 할 점이 있는데,

 

바로 create 시 (회원가입 시) 입력받은 데이터를 검증해주어야 한다는 것입니다.

 

(유효하지 않은 값의 입력을 방지하기 위해)

 

따라서 저는 create 함수를 overriding 한 후 validated_data(유효성 검증을 통과한 값)를 기반으로 User 객체

 

를 생성해주었습니다.

 

views.py
from django.shortcuts import render
from .serializers import UserSerializer
from .models import User
from rest_framework import generics

# 회원가입
class UserCreate(generics.CreateAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer

 

이후 생성한 User 모델과 UserSerializer를 기반으로 views.py를 작성해주었습니다.

 

회원가입은 객체를 생성하는 역할을 하기 때문에 generics.py의 CreateAPIView를 상속받아 사용하였습니다.

 

지난번에 실습했던 것과 유사하게 queryset으로는 User 객체를,

 

serializer_class로는 UserSerializer를 전달해주었습니다.

 

 

 

이렇게 코드 작성을 완료하였다면 서버를 실행시켜줍니다.

python manage.py runserver

 

 

 

서버 실행 후 127.0.0.1:8000/user/signup으로 접속하면 위의 사진과 같이 회원가입을 할 수 있는 화면이 보입니다.

정상적으로 회원 가입을 진행한 후 우측 상단의 Log in 항목을 클릭하면, 아래와 같이 로그인 기능을 사용할 수 있습니다.

 

 

127.0 .01:8000/user/api-auth

 

로그인에 성공하게 되면 아래 그림와 같이 오른쪽 상단에 아이디 값이 나타나는걸 알수 있습니다.

 

 

이상으로 Django Restful API로 회원가입, 로그인 기능을 구현해보았습니다!!!! 

 

다음에는 게시판 기능, 댓글 기능을 만들어 보도록 하겠습니다.

 

 

참조:[여기] 클릭해주세요

728x90

'Django' 카테고리의 다른 글

Django 에서 date 객체 활용 하기  (0) 2023.04.18
Django의 F() 객체란?  (0) 2023.04.14
Django channels 이용하여 채팅하기  (0) 2023.03.25
Django 와 MYSQL 연결  (0) 2023.03.04
DRF 활용한 게시글 과 댓글 작성  (0) 2023.02.21