목표: Django의 기본 User 모델을 활용해서 Django 사용자를 생성하는 REST API 만들기
1. venv 활성화
source bin/activate
2. 필요 패키지 설치, 설정
pip install djangorestframework djangorestframework-simplejwt
파일: 프로젝트명/settings.py
...
INSTALLED_APPS = [
...
'rest_framework',
'rest_framework_simplejwt',
]
...
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework_simplejwt.authentication.JWTAuthentication',
],
}
from datetime import timedelta
SIMPLE_JWT = {
'ACCESS_TOKEN_LIFETIME': timedelta(days=1),
'REFRESH_TOKEN_LIFETIME': timedelta(days=7),
}
3. 프로젝트 URL 설정
파일: 프로젝트명/urls.py
urlpatterns = [
...
path('um/', include('user_manager.urls')),
]
4. 앱 생성
python manage.py startapp user_manager
5. 앱 URL 설정
파일: 앱/urls.py
from django.urls import path
from rest_framework_simplejwt.views import (
TokenObtainPairView,
TokenRefreshView,
TokenVerifyView
)
from .views import UserAddView
urlpatterns = [
path('useradd/', UserAddView.as_view(), name='useradd'),
path('token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
path('token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
path('token/verify/', TokenVerifyView.as_view(), name='token_verify'),
]
6. DRF 시리얼라이저 작성
from django.contrib.auth.models import User
from rest_framework import serializers
class UserSerializer(serializers.ModelSerializer):
password = serializers.CharField(write_only=True)
# write_only=True로 설정하면 해당 필드가 요청에서만 허용되고, 응답에서는 제외됨.
# 패스워드 필드가 JSON 응답에 포함되지 않도록 사전에 방지하기 위함.
class Meta:
model = User
fields = ['id', 'username', 'email', 'password']
def useradd(self, validated_data):
user = User.objects.create_user(
username = validated_data['username'],
email = validated_data['email'],
password = validated_data['password']
)
return user
7. 뷰 작성
from django.contrib.auth.models import User
from rest_framework import generics, status
from rest_framework.response import Response
from rest_framework_simplejwt.tokens import RefreshToken
from rest_framework.permissions import AllowAny
from .serializers import UserSerializer
class UserAddView(generics.CreateAPIView):
# generics.CreateAPIView는 POST 요청으로부터 객체를 생성하는 DRF 제네릭 뷰임.
# 제네릭 뷰는 CRUD 구현을 쉽게 하기 위한 클래스 기반 뷰(CBV)임.
# generics.CreateAPIView 대신 APIView로 직접 구현 시 post() 또한 직접 구현해야 함.
serializer_class = UserSerializer
# CreateAPIView의 필수 필드임. 시리얼라이저를 지정해야 함.
permission_classes = [AllowAny]
# 선택적 필드임. 기본값은 [IsAuthenticated]
def useradd(self):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
user = serializer.save()
# DB에 객체를 저장하고, 응답 JSON을 반환함.
8. 테스트