회원가입과 로그인 등의 기능을 구현하기 위해 위 기능들을 모아놓은 앱을 생성하였습니다.
앱의 이름은 users 입니다.
(myvenv) C:\Users\...\myboard>python manage.py startapp users
앱을 생성하였으니 앱을 등록합니다. (myboard/setting.py)
또한 회원 인증은 기본 토크 인증 방식을 이용합니다.
따라서 rest_framework.authtoken 앱도 추가합니다.
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'rest_framework.authtoken',
'users'
]
또한 프로젝트 인증 방식으로 토큰 방식을 사용한다는 것을 정의하기 위하여
myboard/settings.py 에서 REST_FRAMEWORK 옵션을 만들고 직접 작성해줍니다.
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.TokenAuthentication',
],
}
이렇게 직접 작성을 해줍니다.
모델 > 시리얼라이저 > 뷰 > URL 순으로 개발을 진행해보겠습니다.
모델
Django 기본 User모델을 사용하기 떄문에 users/models.py에 작성할 내용이 없습니다.
이 프로젝트에서는 username, email, password 필드를 사용하겠습니다.
게다가 password2를 입력받아 비밀번호가 재확인 과정을 추가하겠습니다.
시리얼라이저
시리얼라이저는 기본적으로 프로젝트에 포함되지 않기 때문에 users폴더 안에 serializers.py 파일을 생성하겠습니다.
시리얼라이저는 들어온 데이터를 Django데이터로 변환하여 저장합니다.
또 Validation 기능이 있어 회원가입이 기준에 맞는지 검증해줍니다.
from django.contrib.auth.models import User
from django.contrib.auth.password_validation import validate_password # django 기본 패스워드 검증
from rest_framework import serializers
from rest_framework.authtoken.models import Token #Token 모델
from rest_framework.validators import UniqueValidator #이메일 중복 방지 검증
class RegisterSerializer(serializers.ModelSerializer): #회원가입 시리얼라이저
email = serializers.EmailField(
required = True,
validators = [UniqueValidator(queryset=User.objects.all())],
)
password = serializers.CharField(
write_only = True,
required = True,
validators=[validate_password],
)
password2 = serializers.CharField(
write_only = True,
required = True
)
class Meta:
model = User
fields = ('username','password','password2','email')
def validate(self, data):
if data['password'] != data['password2']:
raise serializers.ValidationError(
{"password": "Password fields didn't match."}
)
return data
def create(self, validated_data):
user = User.objects.create_user(
username = validated_data['username'],
email=validated_data['email'],
)
user.set_password(validated_data['password'])
user.save()
token = Token.objects.create(user=user)
return user
뷰
회원가입의 경우 POST(생성만 가능)만 있기 때문에 다른 API요청을 할 필요가 없습니다.
따라서 generics의 CreateAPIView를 사용해 작성합니다.
from django.contrib.auth.models import User
from rest_framework import generics
from .serializers import RegisterSerializer
class RegisterView(generics.CreateAPIView):
queryset = User.objects.all()
serializer_class = RegisterSerializer
URL
앱 URL에 등록한 후
프로젝트 URL에 앱 URL을 등록하여 마무리 합니다.
클래스 형 뷰로 만들었기 때문에 등록시 .as_view()를 사용합니다.
user폴더 안에 urls.py 파일을 만들어서 작성해줍니다.
앱 URL에 register/를 등록하였습니다.
(users/urls.py)
from django.urls import path
from .views import RegisterView
urlpatterns = [
path('register/',RegisterView.as_view()),
]
프로젝트URL에 위 앱 URL을 등록하였습니다.
(myboard/urls.py)
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('users/', include('users.urls')),
]
include 기능을 포함시켜줍니다.
마이그레이션 & 프로젝트 실행
마이그레이션과 마이그레이트를 진행해줍니다.
makemigrations : models.py에서 적용한 변경사항이나 추가된 혹은 삭제된 사항들을 감지하여 파일로 생성
migrate : 적용되지 않은 migrations들을(설정값들을) 적용시키는 역할
우선 settings.py 에서 위 호스트 주소를 작성하여 줍니다.
ALLOWED_HOSTS = ['127.0.0.1']
작성한 후 cmd 가상환경에서 위 명령어를 작성합니다.
(myvenv) C:\Users\...\myboard>python manage.py makemigrations
No changes detected 라고 뜨면 성공
(myvenv) C:\Users\...\myboard>python manage.py migrate
Applying ... ok 라는 줄이 여러 개 나오면 성공 그 후에
(myvenv) C:\Users\...\myboard>python manage.py runserver
라고 한 후 로컬 주소인 127.0.0.1:8000/users/register/에 접속하게 되면
라는 화면이 뜨면 성공입니다.
username, password, password2, email 작성한 후
HTTP 201 Created가 뜨면서
잘 생성된 것을 볼 수 있습니다.
'DJANGO > Django REST' 카테고리의 다른 글
[Django REST]#2-4 회원 기능 구현(모델 확장 방법) (0) | 2023.06.10 |
---|---|
[Django REST]#2-3 회원 기능 구현(로그인 기능) (0) | 2023.06.10 |
[Django REST]#2-1 회원 기능 구현 (0) | 2023.06.10 |
[Django REST]#1 프로젝트 세팅하기 (0) | 2023.06.10 |
[Django REST]#0 게시판 만들기에 앞서 (0) | 2023.06.09 |